在每次入栈的时候判断栈顶元素的字典序是否比待插入的元素大,大的话需要判断栈顶元素的剩余数量,如果没有了则不能出栈,否则出栈,不断维护单调栈,整体呈现非递减序列。
//单调栈
class Solution {
public:
string removeDuplicateLetters(string s) {
//记得初始化为0
vector<int> vis(30);//标记栈中是否已经存在了该字符
vector<int> num(30);//字符串中每个字符的数量
string stk;//因为最后返回字符串,逻辑上理解成一个栈
//首先统计每个字符出现的个数
for(string::iterator it = s.begin();it!=s.end();it++) {
num[(*it)-'a']++;
}
//遍历字符串
for(char ch : s) {
if(!vis[ch-'a']) {//该字符没有入过栈才需要以下操作
while(!stk.empty()&&stk.back()>ch) {
if(num[stk.back()-'a']>0) {//如果该元素后面还有,说明可以删
vis[stk.back()-'a'] = 0;//标记栈中尚无该元素
stk.pop_back();
}
else break;//不处理
}
stk.push_back(ch);
vis[ch - 'a'] = 1;
}
num[ch-'a']--;
}
return stk;
}
};