具体思路:
字符统计单调栈;
map记录后需字符的个数决定要不要弹栈;
同时vis来记录是否已经有重复元素;
具体代码:
class Solution {
public:
string smallestSubsequence(string s) {
map<char,int>mp;
vector<bool>vis(26,false);
for(auto& ch:s){
mp[ch]++;
}
stack<char>st;
for(auto& ch:s){
if(vis[ch-'a']){
mp[ch]--;
continue;
}
if(st.empty()){
st.push(ch);
mp[ch]--;
vis[ch-'a']=true;
continue;
}
while(!st.empty()&&st.top()>=ch&&mp[st.top()]!=0){
vis[st.top()-'a']=false;
st.pop();
}
st.push(ch);
vis[ch-'a']=true;
mp[ch]--;
}
string ret;
while(!st.empty()){
ret.insert(ret.begin(),st.top());
st.pop();
}
return ret;
}
};