思路:
- 从前往后入栈,如果当前元素比栈顶元素小,看看后面是否有栈顶的重复元素,如果没有不弹出,如果有弹出
- 用哈希表<char,bool>来判断当前字符是否在栈中,如果在栈中就不再往栈中放。
代码:
class Solution {
public:
string removeDuplicateLetters(string s) {
string res;
stack<char> st;
unordered_map<char,int> memo;
unordered_map<char,bool> inStack;
for(char c:s){
memo[c]++;
}
for(char c:s){
memo[c]--;
if(inStack[c]) continue;
while(!st.empty()&&st.top()>c){
if(memo[st.top()]==0) break;
else {
inStack[st.top()]=false;
st.pop();
}
}
st.push(c);
inStack[c]=true;
}
while(!st.empty()){
char t=st.top();
st.pop();
res+=t;
}
reverse(res.begin(),res.end());
return res;
}
};