1. 程式人生 > 實用技巧 >316. 去除重複字母 leetcode

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 };