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

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

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;

}
全部评论

相关推荐

专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务