给定一个字符串s由小写字符组成,移除多余的字符使得每个字符只出现一次。你必须保证结果是字典序是最小的合法字符串。
样例
样例1
输入: s = "bcabc"
输出: "abc"
样例2
输入: s = "cbacdcbc"
输出: "acdb"
思路:先遍历记录每一个字符出现的次数,如果该字符已经添加进去过了,则不再添加,因为添加进去后已经前面该部分的最小字符序。若还没添加进去,则和已添加进去的最后一个字符比较,有三种情况:
(1)待添加的字符字典序小于最后一个字符,且最后一个字符还有余量,则替换
(2)待添加的字符字典序小于最后一个字符,但是最后一个字符还有余量,则直接添加待添加字符。
(3)待添加的字符字典序大于最后一个字符,直接添加
class Solution {
public:
/**
* @param s: a string
* @return: return a string
*/
string removeDuplicateLetters(string &s) {
// write your code here
int len=s.size();
string res="";
vector<int> cnt(26,0);
vector<bool> judge(26,false);
for (auto i : s) {
cnt[i-'a']++;
}
for(auto c : s)
{
cnt[c-'a']--;
if(judge[c-'a']) continue;
else
{
while(res.size()>0&&cnt[res.back()-'a']&&res.back()>=c)
{
judge[res.back()-'a']=false;
res.pop_back();
}
}
res.push_back(c);
judge[c-'a']=true;
}
return res;
}
};