ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode316去除重复字母

2021-08-04 20:01:59  阅读:209  来源: 互联网

标签:字符 leetcode316 string 字母 去除 st ans 栈中 charInSt


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有