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;
    }
};
posted @ 2021-01-05 22:42  wrjlinkkkkkk  阅读(99)  评论(0编辑  收藏  举报