zoukankan      html  css  js  c++  java
  • 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 并不会被默认初始化

  • 相关阅读:
    slice()、substring()、substr()的区别用法
    程序员如何快速上手一个自己不太熟悉的新项目?有什么技巧?
    计算重复字符串长度
    计算机视觉算法研发岗招聘要求
    C++进阶STL-2
    C++进阶STL-1
    拼硬币
    序列找数
    寻找合法字符串
    字符串是否由子串拼接
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/5054965.html
Copyright © 2011-2022 走看看