这道题目难度比较大,一个字母一个字母的考虑
b
bc 删去b并不会使字符串变大,所以不删
bca 删去c字符串变大,(而且能删,后面还有c)所以删ba,同理删除b。
abc
维护一个栈,(实际是答案字符串), 使得栈里每个字符只出现一次。而且满足当前字典序最小。在每一步都是局部最小的情况下,可以证明后续字符串全局最小。
这里判断后面是否还有字符串的方法是记录字符串字符最后出现的位置来判断的。
class Solution {
public:
string removeDuplicateLetters(string s) {
string res; // 定义就是当前每个字符只出现一次的字符串
unordered_set<char> hashset; // 记录答案里面已经出现过的字符串
unordered_map<char,int> hashmap; // 最后一次字符出现的位置
for(int i=0;i<s.size();i++) hashmap[s[i]] = i;
for(int i=0;i<s.size();i++){
if(hashset.count(s[i])) continue;
while(res.size()&&s[i]<res.back()&&hashmap[res.back()]>i){
hashset.erase(res.back());
res.pop_back();
}
res+=s[i];
hashset.insert(s[i]);
}
return res;
}
};