leetcode 316.去除重複字母 Java

雲水冰發表於2020-10-20

題目連結

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

描述

給你一個字串 s ,請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小(要求不能打亂其他字元的相對位置)。

注意:該題與 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同

提示:

1 <= s.length <= 104
s 由小寫英文字母組成

示例

示例 1:

輸入:s = "bcabc"
輸出:"abc"

示例 2:

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

初始程式碼模板

class Solution {
    public String removeDuplicateLetters(String s) {

    }
}

程式碼

推薦題解:https://labuladong.gitbook.io/algo/shu-ju-jie-gou-xi-lie/dan-tiao-zhan-qu-zhong
注意題目的三個點就好:
1.去重
2.保留相對位置
3.滿足前兩個條件的情況下字典序最小

class Solution {
    public String removeDuplicateLetters(String s) {
        LinkedList<Character> stack = new LinkedList<>();

        int[] count = new int[256];
        for (int i = 0; i < s.length(); i++) {
            count[s.charAt(i)]++;
        }

        boolean[] inStack = new boolean[256];
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            count[c]--;

            if (inStack[c]) continue;

            while (!stack.isEmpty() && stack.peek() > c) {
                if (count[stack.peek()] == 0) {
                    break;
                }
                inStack[stack.pop()] = false;
            }
            
            stack.push(c);
            inStack[c] = true;
        }

        StringBuilder sbu = new StringBuilder();
        while (!stack.isEmpty()) {
            sbu.append(stack.pop());
        }

        return sbu.reverse().toString();
    }
}

相關文章