删除多余的字符得到最小不重复字典序序列

删除多余的字符得到字典序最小的字符串

http://www.nowcoder.com/questionTerminal/611d16ddd5344bfdb76c22306247dcf3

首先统计各个字符出现的数目 int count[26]
标记数组表明结果中是否包含当前字符 bool visit[26]
对于新来的一个字符,如果已经在结果中那么跳过
如果不在结果中,那么需要判断结果末尾的元素是否需要弹出,条件为:
①末尾元素之后还存在剩余
②末尾元素的字典序比当前字符字典序大

待弹出一定的末尾元素后(或者不需要弹出),当前字符放入到结果中

int main(){
    string s;
    cin>>s;
    int n = s.length();
    bool visit[26]={false};//是否已经添加到最终字符串中
    int count[26]={0};//计数
    vector<char> res;
    for(int i=0;i<n;i++)
        count[s[i]-'a']++;//计数
    for(int i=0;i<n;i++)
    {
        count[s[i]-'a']--;//删除
        if(visit[s[i]-'a'])//已经访问过
        {
            continue;
        }
        //如果没有访问过
        while(res.size()>0 &&  count[res.back()-'a']>0 &&  res.back()>s[i])
        {
            //如果比末尾的小 且末尾后面还有重复字符  那么末尾弹出
            visit[res.back()-'a']=false;
                  res.pop_back();// 
        }
        //当前字符进入
        res.push_back(s[i]);
        visit[s[i]-'a']=true;

    }
    for(auto i:res)
        cout<<i;

}
全部评论

相关推荐

滴滴 后端 薪资n x(15-18),普遍15,3w签字费,12%公积金
点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务