题目难度:中等
题目描述:
返回 s 字典序最小的子序列,该子序列包含 s 的所有不同字符,且只包含一次。
示例 1:
输入:s = “bcabc”
输出:“abc”
示例 2:
输入:s = “cbacdcbc”
输出:“acdb”
提示:
1 <= s.length <= 1000
s 由小写英文字母组成
class Solution {
public:
string smallestSubsequence(string s) {
string ans;
vector<bool> vis(26);
map<char, int> num; // 记录字母出现的次数
for (char ch : s){
num[ch]++;
}
for(char ch : s){
if(vis[ch - 'a'] == false){//说明没有访问过
while(!ans.empty() && ans.back() > ch && num[ans.back()] > 0){
vis[ans.back() - 'a'] = false;
ans.pop_back();
}
ans.push_back(ch);
vis[ch - 'a'] = true;
}
num[ch]--;
}
return ans;
}
};