当前位置:   article > 正文

Leetcode 316 去除重复字母 按顺序贪心_leetcode 按顺序去重

leetcode 按顺序去重

这道题目难度比较大,一个字母一个字母的考虑

b

bc   删去b并不会使字符串变大,所以不删

bca  删去c字符串变大,(而且能删,后面还有c)所以删ba,同理删除b。

abc

维护一个栈,(实际是答案字符串), 使得栈里每个字符只出现一次。而且满足当前字典序最小。在每一步都是局部最小的情况下,可以证明后续字符串全局最小。

这里判断后面是否还有字符串的方法是记录字符串字符最后出现的位置来判断的。

 

  1. class Solution {
  2. public:
  3. string removeDuplicateLetters(string s) {
  4. string res; // 定义就是当前每个字符只出现一次的字符串
  5. unordered_set<char> hashset; // 记录答案里面已经出现过的字符串
  6. unordered_map<char,int> hashmap; // 最后一次字符出现的位置
  7. for(int i=0;i<s.size();i++) hashmap[s[i]] = i;
  8. for(int i=0;i<s.size();i++){
  9. if(hashset.count(s[i])) continue;
  10. while(res.size()&&s[i]<res.back()&&hashmap[res.back()]>i){
  11. hashset.erase(res.back());
  12. res.pop_back();
  13. }
  14. res+=s[i];
  15. hashset.insert(s[i]);
  16. }
  17. return res;
  18. }
  19. };

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/705357
推荐阅读
相关标签
  

闽ICP备14008679号