基本思想:
模仿单调栈思路,但是之所以是模仿,是因为内部序列并不是严格递增的,限制的条件是,逆序的元素必定是只出现一次的元素;
基本代码:
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int>cnt(26,0);
vector<bool>vis(26,false);
string stk;
for(auto& c:s){
cnt[c-'a']++;
}
for(int i=0;i<s.size();i++){
char c=s[i];
cnt[c-'a']--;
if(!vis[c-'a']){
//如果不在栈内:
while(stk.size()>0&&c<*stk.rbegin()){
if(cnt[*stk.rbegin()-'a']>0){
vis[*stk.rbegin()-'a']=false;
stk.pop_back();
}else{
break;
}
}
stk.push_back(c);
vis[c-'a']=true;
}
}
return stk;
}
};