侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

LeetCode 316. 去除重复字母

Hope
2022-09-18 / 0 评论 / 0 点赞 / 217 阅读 / 639 字
温馨提示:
本文最后更新于 2022-09-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

LeetCode 316. 去除重复字母
思路:
统计每个字符最后出现的位置
开辟一个哈希表记录当前字符是否在答案中出现

贪心:

  1. 对于当期的字符,如果小于答案的最后一个字符,且答案的最后一个字符在后面出现过,则答案的最后一个字符就可以删除。
  2. 如果当前字符在答案中出现过,就跳过。
  3. 维护当前字符在答案中是否出现过。

代码:

class Solution {
public:
    string removeDuplicateLetters(string s) {
        stack<int> stk;
        unordered_map<char,int> ops;
        unordered_map<char,bool> hash;

        for(int i = 0; i < s.size(); i++){
            ops[s[i]] = i;
        }

        for(int i = 0; i < s.size(); i++){
            if(hash[s[i]]) continue;
            while(stk.size() && s[i] < s[stk.top()] && ops[s[stk.top()]] > i) {
                hash[s[stk.top()]] = false;
                stk.pop();
            }
            hash[s[i]] = true;
            stk.push(i);
        }
        string ans;
        while(stk.size()){
            ans += s[stk.top()];
            stk.pop();
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};
0

评论区