leetcode316去除重复字母

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;
    }
};

这道题目,如果遇到栈中已经存在当前字符,则直接抛弃当前字符,还可以先将栈顶所有可以弹出的元素弹出后再抛弃。总之,进行字符串处理的过程中,贯穿着对如何处理才能使得字典序最小这一目的的思考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值