316. 去除重复字母 leetcode

原题链接

本题是就是上一道乐扣将去除k位数字的要求换成了去重.要求同样是字典序最小.

这道题的注意点就是:

  1. 去重(只出现一次的再大也不能去掉)
  2. 已经在栈里的小写字母不需要再push进入,不管它多小

因此很容易分析出此单调栈是单调递增栈,到时候将栈内元素pop出再反转即可

 1 class Solution {
 2 public:
 3     string removeDuplicateLetters(string s) {
 4         int counts[30],isin[30];
 5         stack<int> stk; string ans;
 6         fill(counts,counts+30,0);
 7         fill(isin,isin+30,0);
 8         for(int i=0;i<(int)s.size();i++) counts[s[i]-'a']++;
 9         for(int i=0;i<(int)s.size();i++){
10             if(isin[s[i]-'a']){
11                 counts[s[i]-'a']--;
12                 continue;
13             }
14             while(!stk.empty()&&s[stk.top()]>=s[i]&&counts[s[stk.top()]-'a']>1){
15                 counts[s[stk.top()]-'a']--;
16                 isin[s[stk.top()]-'a']=0;
17                 stk.pop();
18             }
19             //栈内是单调递增的序列,比top小的已出现元素不要再加入
20             stk.push(i);
21             isin[s[i]-'a']=1;
22         }
23         while(!stk.empty()){
24             ans+=s[stk.top()];
25             stk.pop();
26         }
27         reverse(ans.begin(),ans.end());
28         return ans;
29     }
30 };

 

posted @ 2020-12-29 08:54  acmloser  阅读(87)  评论(0编辑  收藏  举报