单调栈处理字符串去重

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

示例 1:
输入:s = "bcabc"
输出:"abc"
示例 2:
输入:s = "cbacdcbc"
输出:"acdb"
 
提示:
1 <= s.length <= 104
s 由小写英文字母组成

https://leetcode.cn/problems/remove-duplicate-letters/

import java.util.Stack;

public class RemoveDuplicateSolution {

    public static void main(String[] args) {
        String s = "bcabc";
        System.out.println(removeDuplicateLetters(s));
        s = "cbacdcbc";
        System.out.println(removeDuplicateLetters(s));
    }

    public static String removeDuplicateLetters(String s) {
        Stack<Character> stack = new Stack<>();
        int[] count = new int[512];
        for (char c : s.toCharArray()) {
            count[c]++;
        }

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            count[c]--;
            if (stack.size() != 0) {
                if (stack.contains(c)) {
                    continue;
                }

                while (!stack.isEmpty() && c < stack.peek() && count[stack.peek()] > 0) {
                    stack.pop();
                }
            }

            stack.push(c);
        }

        StringBuffer sb = new StringBuffer();
        for (char c : stack) {
            sb.append(c);
        }

        return sb.toString();
    }
}

 

posted @ 2022-07-21 19:55  牧 天  阅读(66)  评论(0)    收藏  举报