1.4 KiB
1.4 KiB
思路
// 浓浓的单调栈气息
这道题目一点都不简单,输入单调栈里情况比较多的题目。
需要解决如下问题: // 这不是单纯遇到小的 栈里就弹出,判断是否在栈里,情况2 // 如何记录它之前有没有出现过呢,也就是情况1
情况1: 输入:"bbcaac" 输出:"ac" 预期结果:"bac"
情况2 输入:"abacb" 输出:"acb" 预期结果:"abc"
情况3: aba 输出 a 预期是ab
class Solution {
public:
string removeDuplicateLetters(string s) {
int letterCount[26] = {0};
for (int i = 0; i < s.size(); i++) {
letterCount[s[i] - 'a']++;
}
bool isIn[26] = {false}; // 1 已经在栈里,0 不在栈里
string st;
for (int i = 0; i < s.size(); i++) {
while(!st.empty()
&& s[i] < st.back()
&& letterCount[st.back() - 'a'] > 0 // 保证字符串i之后还有这个栈顶元素,栈才能做弹出操作,情况3
&& isIn[s[i] - 'a'] == false) { // 如果栈里已经有s[i]了,跳过:情况2
isIn[st.back() - 'a'] = false;
st.pop_back();
}
if (isIn[s[i] - 'a'] == false) {
st.push_back(s[i]);
isIn[s[i] - 'a'] = true;
}
letterCount[s[i] - 'a']--; // 只要用过了就减一:情况1
}
return st;
}
};