leetcode-master/problems/0316.去除重复字母.md

1.4 KiB
Raw Blame History

思路

// 浓浓的单调栈气息

这道题目一点都不简单,输入单调栈里情况比较多的题目。

需要解决如下问题: // 这不是单纯遇到小的 栈里就弹出判断是否在栈里情况2 // 如何记录它之前有没有出现过呢也就是情况1

情况1: 输入:"bbcaac" 输出:"ac" 预期结果:"bac"

情况2 输入:"abacb" 输出:"acb" 预期结果:"abc"

情况3 aba 输出 a 预期是ab

class Solution {
public:
    string removeDuplicateLetters(string s) {
        int letterCount[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            letterCount[s[i] - 'a']++;
        }
        bool isIn[26] = {false}; // 1 已经在栈里0 不在栈里
        string st;
        for (int i = 0; i < s.size(); i++) {
            while(!st.empty()
                    && s[i] < st.back()
                    && letterCount[st.back() - 'a'] > 0 // 保证字符串i之后还有这个栈顶元素栈才能做弹出操作情况3
                    && isIn[s[i] - 'a'] == false) { // 如果栈里已经有s[i]了跳过情况2
                isIn[st.back() - 'a'] = false;
                st.pop_back();
            }
            if (isIn[s[i] - 'a'] == false) {
                st.push_back(s[i]);
                isIn[s[i] - 'a'] = true;
            }
            letterCount[s[i] - 'a']--; // 只要用过了就减一情况1
        }
        return st;
    }
};