class Solution {
public:
string removeDuplicateLetters(string s)
{
vector<int> vis(26); //vis数组用于判断当前遍历到的字符是否已经在要输出的stk中
vector<int> num(26);
for (int i = 0;i < s.size();i++)
{
num[s[i] - 'a']++; //num数组用于记录每种小写字符出现的次数
}
string stk; //返回的结果
for (int i = 0;i < s.size();i++)
{
if (!vis[s[i] - 'a']) //如果当前遍历到的字符不在要输出的stk中
{
while (!stk.empty() && stk.back() > s[i]) //stk不为空且stk的最后一个字符大于当前遍历到的字符时
{
if (num[stk.back() - 'a'] > 0) //如果这stk的最后一个字符在之后还会出现
{
vis[stk.back() - 'a'] = 0; //将stk的最后一个字符更改为不在栈中
stk.pop_back(); //将最后一个字符出栈
}
else
{
break;
}
}
vis[s[i] - 'a'] = 1; //将当前字符更改为在栈中
stk.push_back(s[i]); //将当前字符压入栈中
}
num[s[i] - 'a'] -= 1; //当前字符的出现次数-1.
}
return stk;
}
};
ps:这道题没有写出来,看的官方题解,总是想着用下标去找,但是思路上总有纰漏。