Leetcode 316去除重复字母
-
题目简述:给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
-
输入:“bcabc” 输出: “abc”
输入:“cbacdcbc” 输出: “acdb”
-
思路:从前往后遍历整个字符串,并用一个栈维护当前答案:
- 如果当前字符已经在答案中,直接跳过
- 如果没有,就将该字符加入答案中。但是为了保证字典序最小,需要考虑是否弹出栈顶元素,弹出的条件是:当前元素小于栈顶元素,并且当前栈顶元素还在后面出现过
- 使用一个哈希表记录每个字符最后一次出现的位置,再用一个标记数组判断当前字符是否在答案中出现过
class Solution {
public:
string removeDuplicateLetters(string s) {
string res;
unordered_map<char, int> hash;
vector<bool> vec(26,false);
for(int i = 0; i < s.size(); i++) hash[s[i]] = i;
for(int i = 0; i < s.size(); i++)
{
if(vec[s[i] - 'a']) continue;
//i < hash[res.back()]表示栈顶元素还会在当前元素后面出现
while(res.size() > 0 && s[i] < res.back() && i < hash[res.back()])
{
vec[res.back() - 'a'] = false;
res.pop_back();
}
res += s[i];
vec[s[i] - 'a'] = true;
}
return res;
}
};