给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同
示例 1:
输入:s = "bcabc"
输出:"abc"
示例 2:
输入:s = "cbacdcbc"
输出:"acdb"
提示:
1 <= s.length <= 104
s 由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-letters
注意的点:什么时候需要出栈,什么时候需要入栈。
代码:
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int> vis(26), num(26);
//统计各个字符出现次数
for(auto ch:s){
num[ch-'a']++;
}
//初始化一个栈
string stk;
//字符入栈
for(auto ch:s)
{
//如果字符没在栈里出现
if(vis[ch-'a']==0)
{
//当栈不为空,且最后一个字符比要入栈的字符大,且后面还有这个字符时需要出栈
while(!stk.empty()&&stk.back()>ch&&num[stk.back()-'a']>0)
{
//出栈之后,更改标志
vis[stk.back()-'a']=0;
//弹出最后一个字符
stk.pop_back();
}
//当前字符入栈,更改标志
vis[ch-'a']=1;
stk.push_back(ch);
}
//该字符数量减少
num[ch-'a']--;
}
//返回栈结果
return stk;
}
};