24去除重复字母(316)

作者: Turbo时间限制: 1S章节: 贪心

晚于: 2020-07-22 12:00:00后提交分数乘系数50%

截止日期: 2020-07-29 12:00:00

问题描述 :

给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

 

示例 1:

输入: "bcabc"

输出: "abc"

 

示例 2:

输入: "cbacdcbc"

输出: "acdb"

 

输入说明 :

输入一个仅包含小写字母的字符串

输出说明 :

输出结果。首尾无多余空格或空行。

输入范例 :

输出范例 :

1,如果stk栈顶的元素大于当前遍历到的元素,根据上述原则,则应该在条件允许的情况下回避这一情况,根据题目要求(去重),只有在后续还有这个栈顶元素的情况下才能将这个栈顶元素去掉(减少一个逆序)。如果后续没有这个栈顶元素,则只能将它保留在这儿,即使它大于它的下一个元素。

2这样一来,stk中保存的两两相邻元素要么是顺序的(前一个小于后一个)要么是逆序的(前一个大于后一个,虽有违背最小排列,但由于没有后续相同元素可以替换,只能这样将就)。

3,由2)可知如果当前元素存在于stk中,则说明stk中的这个元素已经是顺序的了(^-^),所以应该在循环中先判断这一情况,直接跳过当前元素。

4,同时,当根据条件去掉一个栈顶元素时,新的栈顶元素可能也大于当前元素,所以应该继续判断新的栈顶元素和当前元素的关系,用一个while循环,直到出现一个不满足循环条件的栈顶元素(要么小于当前元素,要么大于当前元素但后续又无与之相同的元素来替代)。
作者:fu-guang
链接:https://leetcode-cn.com/problems/remove-duplicate-letters/solution/c-0ms-ji-bai-100jian-ming-dai-ma-chao-xiang-xi-jie/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#include <iostream>
#include <string>
#include <vector>
using namespace std; 

class Solution {
public:
    string removeDuplicateLetters(string s)
    {
        string str;
        int i=0;
        for(i=0;i<s.size();i++)
        {
            if(str.find(s[i])!=string::npos)//str.find("哦")!=string::npos则说明字符串str中存在“哦”这个字符
                continue;
            while(!str.empty()&&str.back()>s[i]&&s.find(str.back(),i)!=string::npos)////从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标position=s.find("b",5);
                str.pop_back();
            str.push_back(s[i]);
        }
        return str;
    }
};
int main()
{
    string s;
    cin>>s;
    string res="";
    res=Solution().removeDuplicateLetters(s);
    cout<<res;
} 
//http://www.cppblog.com/lmlf001/archive/2006/04/19/5883.html
//https://leetcode-cn.com/problems/remove-duplicate-letters/solution/c-0ms-ji-bai-100jian-ming-dai-ma-chao-xiang-xi-jie/

 

posted on 2020-09-06 17:12  Hi!Superman  阅读(234)  评论(0)    收藏  举报

导航