1081. 不同字符的最小子序列
返回 s 字典序最小的子序列,该子序列包含 s 的所有不同字符,且只包含一次。
思路
- 首先就想到了单调栈,维护一个单点递增栈,可以得到字典序最小的子序列。
- 但是单调栈没有考虑题目的条件,需要包含所有不同字符并且只能出现一次,因此需要一个记录当前栈出现字符的数组,以及一个计算字符总数的数组,如果需要删除的字符在后面不出现了,就不能删除了。
代码
class Solution {
public:
string smallestSubsequence(string s) {
vector<int> count(26, 0), vis(26, 0);
for(const char& c : s) {
++count[c - 'a'];
}
string ans = "";
for(const char& c : s) {
if(!vis[c - 'a']) {
while(!ans.empty() && ans.back() > c) {
if(count[ans.back() - 'a'] > 0) {
vis[ans.back() - 'a'] = 0;
ans.pop_back();
}
else {
break;
}
}
ans.push_back(c);
vis[c - 'a'] = 1;
}
--count[c - 'a'];
}
return ans;
}
};