316. Remove Duplicate Letters

问题描述:

 

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example 1:

Input: "bcabc"
Output: "abc"

Example 2:

Input: "cbacdcbc"
Output: "acdb"

 

解题思路:

这道题目很有意思啊,既要得到字符串中不重复的字符,又要让其满足最小的字母顺序,就是若有"bc"  和"cb" 同时出现,选择"cb"

首先遍历一遍字符串记录每个字符串出现的次数。

然后在开始从头遍历这个字符串:

  1. 首先对它出现次数进行减一。

  2.检查它是否被访问过,若被访问过,则表明它已经有合适的位置了

  3.若没有被访问过,首先和字符串尾部的字符比较大小:

    如果字符串尾部比当前字符小,则已经是从小到大的顺序了

    如果字符串尾部比当前字符大,则需要检查后面是不是还出现过这个字符:即检查它的剩余次数是否为0.

        若后面还会出现,将尾部字符的访问值设为false来访问后面的,并且取出尾部字符

  4.然后将该字符加入到字符尾部

  5.并将该字符的访问值设为true

 

代码:

class Solution {
public:
    string removeDuplicateLetters(string s) {
        vector<int> m(256, 0);
        vector<bool> visited(256,false);
        for(char c : s){
            m[c]++;
        }
        string ret = "0";
        for(char c : s){
            m[c]--;
            if(visited[c]) continue;
            while(c < ret.back() && m[ret.back()] > 0){
                visited[ret.back()] = false;
                ret.pop_back();
            }
            ret += c;
            visited[c] = true;
        }
        
        return ret.substr(1);
        
    }
};

 

转载于:https://www.cnblogs.com/yaoyudadudu/p/9236842.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值