去除重复字符

此博客链接:https://www.cnblogs.com/ping2yingshi/p/14162380.html

去除重复字母

题目链接:https://leetcode-cn.com/problems/remove-duplicate-letters/

题目

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

注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同

 

示例 1:

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

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

提示:

1 <= s.length <= 104
s 由小写英文字母组成

题解

前言

此题我瞅一眼,就想到华哥说的哈希表,本来就想着不做了,但是看看是中等难道,可能事情没有那么简单。

错误思路

按照惯例,这里把字母作为key,而个数记为value。然后对字符排序,即为结果。

正确思路

我把题目看错了,人家要求的是有序,还得按照字典序最小,看了一些题解,这题目,是使用栈来做,然后里面说有序,可以利用栈来去重,然后在比较栈顶字母是否比当前字母的字典数小,如果是小的话,就把栈顶元素出栈,把当前元素进栈,这样最后出栈的时候是小的先出栈。需要注意的是,在判断栈顶元素和当前字母大小时,需要判断当前字母后面时候还有和栈顶一样的字母。

代码

class Solution {
    public String removeDuplicateLetters(String s) {
        Stack<Character> stack=new Stack();
        for(int i=0;i<s.length();i++)
        {
            char zimu=s.charAt(i);
            if(stack.contains(zimu))
            {
                continue;
            }
            while(!stack.isEmpty()&&stack.peek()>zimu&&s.indexOf(zimu,s.length())!=-1)
            {
                stack.pop();
            }
            stack.push(zimu);
        }
        char[] res=new char[stack.size()];
        for(int i=0;i<res.length;i++){
            res[i]=stack.pop();
        }
        return new String(res);
    }
}

 

结果

也不知道为啥输出不对,我自己走了一遍,下面案例输出的应该和标答一样呢。

 

posted @ 2020-12-20 01:29  萍2樱释  阅读(212)  评论(1编辑  收藏  举报