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

 

posted @ 2018-06-28 06:43  妖域大都督  阅读(210)  评论(0编辑  收藏  举报