作者:
晚于: 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接: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/