choose记录筛选中的字符,pop掉前面在后面有出现而且比当前i更大的元素。
class Solution {
public:
string smallestSubsequence(string s) {
if(s==""){
return "";
}
string r="";
unordered_map<char,int>res,choose;
for(int i=0;i<s.length();i++){
if(res.count(s[i])){
res[s[i]]++;
}
else{
res[s[i]]=1;
}
}
for(int i=0;i<s.length();i++){
res[s[i]]--;
if(r.length()){
if(choose[s[i]]==0){
while(r.back()>s[i] && res[r.back()]>0){
choose[r.back()]=0;
r.pop_back();
}
r+=s[i];
choose[s[i]]=1;
}
}
else{
choose[s[i]]=1;
r+=s[i];
}
}
return r;
}
};