去除重复字母
要将一个字符串去掉重复字符并使最后字典序最小,
点击查看代码
class Solution
{
public:
string removeDuplicateLetters(string s)
{
// 第一个map,用于记录每个字符最后出现的位置
map<char, int> mp;
// 第二个map,用于记录每个字符是否已经被加入到zhan中
map<char, int> vis;
// 记录每个字符最后出现的位置
for (int i = 0; i < s.size(); i++)
mp[s[i]] = i;
// 模拟栈,
vector<char> st;
// 再次遍历字符串s
for (int i = 0; i < s.size(); ++i)
{
// 如果当前字符已经在栈中,则跳过
if (vis[s[i]])
{
continue;
}
while (st.size() && s[i] < st.back() && mp[st.back()] > i) // // 当栈不为空,且栈顶元素大于当前字符,且栈顶元素在后面还会出现时,需要弹出栈顶元素,以保证结果字符串的字母按字母表顺序排列
{
// 更新vis中对应字符的状态
vis[st.back()]--;
st.pop_back();
}
// 将当前字符压入栈中,并标记为已出现
st.push_back(s[i]);
vis[s[i]]++;
}
string res;//便利更改为字符串
for (int i = 0; i < st.size(); i++)
{
res += st[i];
}
return res;
}
};