leetcode316去除重复字母
作者:互联网
这一题中堆字符串有三个要求
1.去重
2.相对位置不变
3.字典序最小
要保持相对位置不变,可以理解为在原字符串中对每个字符选择保留或者删除,这样处理完的字符串中的各个字符就肯定保持了原本的相对位置不变。
至于这一题为什么要选择单调栈来处理,我想是在思考这道题目的时候,进行遍历,发现了先进后出的规律,才能想到用栈,进而在字典序要最小的要求下,才产生了单调栈的想法。绝不是上来一眼就看出来使用单调栈。
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<char>charFre(26,0); //记录s中每种字符的频率
vector<char>charInSt(26,0); //记录栈中已有的char
for(auto&c:s)
charFre[c-'a']++;
//单调栈
stack<char>st;
for(auto&c:s){
//如果栈中已有c,直接跳过
if(charInSt[c-'a']!=0){
charFre[c-'a']--; //后序c的个数-1
continue;}
/*
出栈的条件
1.栈不为空
2.c<栈顶元素
3.栈顶元素后序还有
*/
while( !st.empty() && c<st.top() && charFre[st.top()-'a']>0){
charInSt[st.top()-'a']--;
st.pop();
}
st.push(c);
charInSt[c-'a']++;
charFre[c-'a']--;
}
string ans="";
while(!st.empty()){
ans=st.top()+ans;
st.pop();
}
return ans;
}
};
这道题目,如果遇到栈中已经存在当前字符,则直接抛弃当前字符,还可以先将栈顶所有可以弹出的元素弹出后再抛弃。总之,进行字符串处理的过程中,贯穿着对如何处理才能使得字典序最小这一目的的思考。
标签:字符,leetcode316,string,字母,去除,st,ans,栈中,charInSt 来源: https://blog.csdn.net/weixin_42259088/article/details/119391696