leetcode1081/316 求字典序最小的包含所有出现字符一次的子序列
题意
rt
思路
删除所有可删的\(s_i\),其中\(s_i>s_{i+1}\)
这个过程可以用栈解决
由于题目要求每个出现的字符出现在答案中一次
所以要维护某字符是否在栈中,以及之后是否还有这个字符
代码
class Solution {
public:
string smallestSubsequence(string s) {
int n = s.length();
string ans;
int num[26], vis[26];
memset(num, 0, sizeof(num));
for(int i = 0; i < n; i++){
num[s[i] - 'a']++;
vis[s[i] - 'a'] = 0;
}
for(int i = 0; i < n; i++){
if(!vis[s[i] - 'a']){
while(!ans.empty() && ans.back() > s[i] && num[ans.back() - 'a']){
vis[ans.back() - 'a'] = 0;
ans.pop_back();
}
ans.push_back(s[i]);
vis[s[i] - 'a'] = 1;
}
num[s[i] - 'a']--;
}
return ans;
}
};