LeetCode_316去除重复字母

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

示例 1:

输入: “bcabc”
输出: “abc”
示例 2:

输入: “cbacdcbc”
输出: “acdb”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-letters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    /*
    * 采用栈
    * 1、当前元素>栈顶元素  直接压入
    * 2、当前元素<栈顶元素,查看后面还有没有栈顶元素,如果有,弹出栈顶元素,压入当前元素
    */
    public String removeDuplicateLetters(String s) {
        int len = s.length();
        if(len<2) return s;
        int[] lastIndex = new int[26];//存储单词出现的最后位置,未出现置为-1
        Arrays.fill(lastIndex,-1);
        for(int i=0;i<len;i++){
            char ch = s.charAt(i);
            lastIndex[ch-'a'] = i;
        }
        Set<Character> set = new HashSet<Character>();//存储当前栈中的元素
        Stack<Character> stack = new Stack<Character>();
        for(int i=0;i<len;i++){
            char ch = s.charAt(i);
            if(set.contains(ch)) continue;
            while(!stack.isEmpty() && stack.peek()>ch && lastIndex[stack.peek()-'a']>=i){
                Character temp = stack.pop();
                set.remove(temp);
            }
            stack.push(ch);
            set.add(ch);
        }
        StringBuilder stringBuilder = new StringBuilder();
        while (!stack.empty()) {
            stringBuilder.insert(0, stack.pop());
        }
        return stringBuilder.toString();
    }
}
发布了250 篇原创文章 · 获赞 0 · 访问量 1262

猜你喜欢

转载自blog.csdn.net/qq_36198826/article/details/103844485