首页 > 其他 > 详细

316. 去除重复字母 leetcode

时间:2020-12-29 11:18:48      阅读:25      评论:0      收藏:0      [点我收藏+]

原题链接

本题是就是上一道乐扣将去除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 };

 

316. 去除重复字母 leetcode

原文:https://www.cnblogs.com/newblg/p/14204683.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!