leetcode 316. Remove Duplicate Letters

来源:互联网 发布:三国演义的漏洞 知乎 编辑:程序博客网 时间:2024/06/08 13:22

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:

Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "acdb"


这个题很有意思。

1、首先chars[]保存每个字符最后出现的位置。

2、找chars[]里的最小值,获得这个位置pos。

3、从[start, pos]中搜索最小的字符,加入ret。start = 这个字符位置+1。

4、chars[这个字符] = -1;因为一个字符只要一次。

5、重复2-4


class Solution {public:    string removeDuplicateLetters(string s)     {        string ret = "";        vector<int> chars(26, -1);        for (int i = 0; i < s.size(); i++)            chars[s[i] - 'a'] = i;                start = 0;        while (1)        {            int pos = findminpos(chars);            if (pos == -1) break;            char c = findminchar(pos, s, chars);            ret = ret + c;            chars[c - 'a'] = -1;         }        return ret;    }private:    int start;        int findminpos(vector<int>& chars)    {        int ret = INT_MAX;        for (auto it : chars)        {            if (it != -1)                ret = min(ret, it);        }        return (ret == INT_MAX) ? -1 : ret;    }        char findminchar(int pos, string& s, vector<int>& chars)    {        char ret = 'z';        for (int i = start; i <= pos; i++)        {            if (chars[s[i] - 'a'] != -1 && s[i] < ret)            {                    ret = s[i];                start = i + 1;            }        }        return ret;    }};


原创粉丝点击