316. 去除重复字母 leetcode
本题是就是上一道乐扣将去除k位数字的要求换成了去重.要求同样是字典序最小.
这道题的注意点就是:
- 去重(只出现一次的再大也不能去掉)
- 已经在栈里的小写字母不需要再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 };