LeetCode 316. 去除重复字母
思路:
统计每个字符最后出现的位置
开辟一个哈希表记录当前字符是否在答案中出现
贪心:
- 对于当期的字符,如果小于答案的最后一个字符,且答案的最后一个字符在后面出现过,则答案的最后一个字符就可以删除。
- 如果当前字符在答案中出现过,就跳过。
- 维护当前字符在答案中是否出现过。
代码:
class Solution {
public:
string removeDuplicateLetters(string s) {
stack<int> stk;
unordered_map<char,int> ops;
unordered_map<char,bool> hash;
for(int i = 0; i < s.size(); i++){
ops[s[i]] = i;
}
for(int i = 0; i < s.size(); i++){
if(hash[s[i]]) continue;
while(stk.size() && s[i] < s[stk.top()] && ops[s[stk.top()]] > i) {
hash[s[stk.top()]] = false;
stk.pop();
}
hash[s[i]] = true;
stk.push(i);
}
string ans;
while(stk.size()){
ans += s[stk.top()];
stk.pop();
}
reverse(ans.begin(), ans.end());
return ans;
}
};
评论区