【LeetCode316】去除重复字母(单调栈+哈希)

简介: 先读懂题意,删除重复的字母,得到最小的字符串。如babc,删除重复字母有两种结果bac,abc。abc小于bac,所以答案是abc。遇到一个新字符 如果比栈顶小 并且在新字符后面还有和栈顶一样的 就把栈顶的字符抛弃了。

一、题目

image.png

二、思路

先读懂题意,删除重复的字母,得到最小的字符串。如babc,删除重复字母有两种结果bac,abc。abc小于bac,所以答案是abc。


遇到一个新字符 如果比栈顶小 并且在新字符后面还有和栈顶一样的 就把栈顶的字符抛弃了。


(1)前者的条件即单调栈的步骤(for中带while);可以用哈希表inst统计当前字符是否在栈中。

(2)为了满足后者的条件,即如果栈顶元素大于当前遍历到的字符s[i],并且栈顶元素在后面还存在,所以可以放心的pop掉。可以用哈希表cnt统计s中剩余字符的出现次数。

(3)上面的循环操作后,得到最后的栈,把栈底到栈顶元素串成字符串。

image.png



三、代码

class Solution {
public:
    string removeDuplicateLetters(string s) {
        stack<char> st;
        //剩余字符出现次数的哈希表
        unordered_map<char, int> cnt;
        //当前字符是否存在栈中
        unordered_map<char, bool> inst;
        for(auto& c: s){
            ++cnt[c];
        }
        for(int i= 0; i < s.size(); i++){
            char c = s[i];
            //当前字符已经在栈中则跳出循环
            if(inst[c]){
                --cnt[c];
                continue;
            }
            //栈顶元素大于当前字符,并且栈顶元素在后面还存在,所以可以pop
            while(!st.empty() && st.top() > c && cnt[st.top()] > 0){
                inst[st.top()] = false;
                st.pop();
            }
            st.push(c);
            --cnt[c];
            //当前c字符存在栈中
            inst[c] = true;
        }
        string res;
        //把栈底到栈顶元素串成字符串
        while(!st.empty()){
            res = st.top() + res;
            st.pop();
        }
        return res;
    }
};
相关文章
|
2月前
《LeetCode》—— 哈希
《LeetCode》—— 哈希
LeetCode 热题100——单调栈
LeetCode 热题100——单调栈
19 0
|
2月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
2天前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
5 0
|
2天前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
9 2
|
2天前
leetcode代码记录(有效的字母异位词
leetcode代码记录(有效的字母异位词
8 1
|
17天前
[leetcode] 705. 设计哈希集合
[leetcode] 705. 设计哈希集合
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
24天前
|
C语言
Leetcode每日一题——“用栈实现队列”
Leetcode每日一题——“用栈实现队列”
|
24天前
|
C语言
Leetcode每日一题——“用队列实现栈”
Leetcode每日一题——“用队列实现栈”

热门文章

最新文章