首页 > 编程语言 >316. 去除重复字母 (JAVA)

316. 去除重复字母 (JAVA)

时间:2023-07-22 16:55:21浏览次数:58  
标签:letterStack JAVA charAt int 字母 316 去除 letterCnt new

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

 

示例 1:

输入:s = "bcabc"
输出:"abc"
示例 2:

输入:s = "cbacdcbc"
输出:"acdb"
 

提示:

1 <= s.length <= 10^4

解题思路:

当前字母比前一个字母小,且,前一个字母有重复,那么前一个字母被舍弃 舍弃之后,判断再前一个字母是否也比当前字母小 -> 这里想到用栈,后进先判断。
class Solution {
    public String removeDuplicateLetters(String s) {
        int[] letterCnt = new int[26];
        for (int i = 0; i < s.length(); i++) {
            letterCnt[s.charAt(i) - 'a']++;
        }

        Stack<Character> letterStack = new Stack<>();
        Set<Character> curSet = new HashSet<>();
        for (int i = 0; i < s.length(); ) {
            if (curSet.contains(s.charAt(i))) { //如果之前出现过,则直接舍弃
                letterCnt[s.charAt(i)-'a']--;
                i++;
            } else if (!letterStack.isEmpty() && letterStack.peek() > s.charAt(i) && letterCnt[letterStack.peek()-'a'] > 1) { //如果比前一个字符小且前一个字符在之后会有重复出现,那么舍弃前一个字符
                curSet.remove(letterStack.peek());
                letterCnt[letterStack.pop()-'a']--;
            } else { //否则,入栈
                letterStack.push(s.charAt(i));
                curSet.add(s.charAt(i));
                i++;
            }
        }

        StringBuilder sb = new StringBuilder();
        while(!letterStack.isEmpty()) {
            sb.append(letterStack.pop());
        }
        return sb.reverse().toString();
    }
}

 

标签:letterStack,JAVA,charAt,int,字母,316,去除,letterCnt,new
From: https://www.cnblogs.com/qionglouyuyu/p/17573686.html

相关文章

  • java学习笔记
    目录值传递&引用传递WeakHashMap-弱引用MapHashMapResponseEntityMessageFormat.format-代码里直接打印输出如何将java项目的依赖打成一个大的jar包加载证书报错:Couldnotparsecertificate:java.io.IOException:Incompletedatapowermock使用注意jpa的使用注意AOP切面java......
  • JavaScript继承
    继承—通过原型1.共同functionA(){}functionB(){}constg={a:1,b:2,};我想让从A、B构造出来的对象都具有g其中的属性,就可以通过继承A.prototype=gA.prototype.constructor=Aconsole.log(A.prototype)//{a:1,b:2,constructor:[Function:Man]}......
  • java内存分析工具使用
    目录参考链接1、名词解释2、常见异常java堆内存异常java栈内存异常方法区内存异常3、解决思路4、生成dump文件的三种方式jvisualvmjmap命令应用启动配置5、MemoryAnalyzer分析工具参考链接Java内存溢出OOM之dump分析1、名词解释内存泄露:代码中的某个对象本应该被虚拟机回收,......
  • java源码加密代码
    1、java代码想加密怎么处理?2、java加密解密代码3、如何有效防止Java程序源码被人偷窥?4、Java编程实现将文件加密,将源程序补充完整5、用java写个文件加密的代码该怎么写6、java项目如何加密?java代码想加密怎么处理?只给编译后java源码加密的.jar文件java源码加密,不给......
  • java开发工程师工作总结
    1、java主要是做什么的?2、java核心思想小结3、javaweb开发需要哪些技术请总结全点4、为什么java开发游戏性能和效率差java主要是做什么的?、科学应用现在Java经常是科学应用java开发年终总结的默认选择java开发年终总结,包括了自然语言处理。这主要的原因是因为Java比起C+......
  • 修改java路径
    修改Java路径在进行Java编程时,我们经常需要配置Java的路径。Java路径包括JavaDevelopmentKit(JDK)的安装路径和JavaRuntimeEnvironment(JRE)的安装路径。本文将为您介绍如何修改Java路径,并提供代码示例来帮助您更好地了解这个过程。为什么需要修改Java路径?在某些情况下,......
  • JavaNote-概述及安装
    1.Java语言概述1.1Java概述是SUN(StanfordUniversityNetwork,斯坦福大学网络公司)1995年推出的一门高级编程语言。是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序(Applet),内嵌在HTML代码中。伴......
  • Javaswing 改变页面时不刷新
    Javaswing改变页面时不刷新的实现作为一名经验丰富的开发者,我将教会你如何实现在Javaswing中改变页面时不刷新的功能。首先,让我们来了解整个实现过程的流程,然后逐步介绍每个步骤需要做的事情和相应的代码。实现流程下面是实现Javaswing改变页面时不刷新的流程,可以使用表格......
  • Java增量业务
    实现Java增量业务流程引言在软件开发过程中,有时候需要对已有数据进行增量更新,而不是对整个数据集进行处理。在Java中,可以通过一些类库和技巧实现增量业务。本文将介绍实现Java增量业务的流程,并提供示例代码供参考。流程下表展示了实现Java增量业务的流程步骤:步骤描述......
  • JavaScript多线程
    JavaScript多线程实现流程1.基本概念在开始讲解JavaScript多线程之前,我们需要先了解一些基本概念。单线程:JavaScript是一门单线程语言,即每次只能执行一项任务。这是因为JavaScript的设计初衷是用于前端交互和操作DOM,多线程会带来复杂性和安全性问题。多线程:多线程指的是同时......