Remove Duplicate Letters

题目就是给一串全小写的字符,要求删除重复的字符。另外最后的结果必须首先按照原文顺序排列,其次是按照字典序排列。

比如说:

Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "acdb"

按照提示,说是贪心算法。贪心吗,每一步只要当前最优的解。

好吧,当前最优的解是什么?

删除重复字符:是独一无二的

按原文顺序排列:从头遍历

按照字典序遍历:最小的字符

所以方法就是从头遍历,参照以上标准核对每个元素,得到当前的最优解后抛弃之前没被选中的元素,并在之后的内容中删去所选元素。

所以代码如下:

string removeDuplicateLetters(string s) {
    if (s.empty() || s.size() == 1) {
        return s;
    }
    vector<int> count(26);
    int selectedIndex = 0;
    for (const auto& ch : s){
        ++count[ch - 'a'];
    }
    for (int i = 0; i != s.length(); ++i){
        if (s[i] < s[selectedIndex]){
            selectedIndex = i;
        }
        if ((--count[s[i] - 'a']) == 0){
            break;
        }
    }
    auto const selectedElem = s[selectedIndex];
    s.erase(s.begin(), s.begin() + selectedIndex + 1);
    for (auto it = s.begin(); it != s.end();
         (*it == selectedElem? it = s.erase(it) : ++it));
    return (selectedElem + removeDuplicateLetters(s));
}

需要注意的是:

容器 array 并不会被默认初始化

容器 array 并不会被默认初始化

容器 array 并不会被默认初始化

原文地址:https://www.cnblogs.com/wuOverflow/p/5054965.html