首页 > 其他 > 详细

leetcode1081/316 求字典序最小的包含所有出现字符一次的子序列

时间:2021-01-06 09:04:14      阅读:23      评论:0      收藏:0      [点我收藏+]

题意

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;
    }
};

leetcode1081/316 求字典序最小的包含所有出现字符一次的子序列

原文:https://www.cnblogs.com/wrjlinkkkkkk/p/14238501.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!