首页 > 其他 > 详细

Remove Duplicate Letters

时间:2015-12-17 19:17:32      阅读:160      评论:0      收藏:0      [点我收藏+]

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

比如说:

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 并不会被默认初始化

Remove Duplicate Letters

原文:http://www.cnblogs.com/wuOverflow/p/5054965.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!