316. 去除重複字母 leetcode
阿新 • • 發佈:2020-12-24
本題是就是上一道樂扣將去除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; 6fill(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 };