Leetcode 316. 去除重复字母(中等) 1081. 不同字符的最小子序列(中等) 字符串去重
题目:
思路:
题目的要求总结出来有三点:
要求一、要去重。
要求二、去重字符串中的字符顺序不能打乱 s
中字符出现的相对顺序。
要求三、在所有符合上一条要求的去重字符串中,字典序最小的作为最终结果。
比如说输入字符串 s = "babc"
,去重且符合相对位置的字符串有两个,分别是 "bac"
和 "abc"
,但是我们的算法得返回 "abc"
,因为它的字典序更小。
我们可以借用单调栈的思路,在放入元素c时踢出大于c的元素。
但是踢出的条件是,如果count[d]>0,即后续仍旧有d可以加入。
class Solution { public: string removeDuplicateLetters(string s) { // 维护一个计数器记录字符串中字符的数量 // 因为输入为 ASCII 字符,大小 256 够用了 vector<int> count(256); for(int i=0;i<s.size();++i){ count[s[i]]++; } //记录字符是否已进栈 vector<bool> inStack(256); stack<char> stk; for(int i=0;i<s.size();++i){ char c=s[i]; // 每遍历过一个字符,都将对应的计数减一 count[c]--; //如果已进栈,就直接跳过 if(inStack[c]){ continue; } //如果栈顶元素大于c,对栈顶元素操作 while(!stk.empty()&&stk.top()>c){ // 若之后不存在栈顶元素了,则停止 pop if(count[stk.top()]==0){ break; } // 若之后还有,则可以 pop inStack[stk.top()]=false; stk.pop(); } stk.push(c); inStack[c]=true; } //反序取出栈内元素组合成字符串 string ret; while(!stk.empty()){ ret=stk.top()+ret; stk.pop(); } return ret; } };
与上题完全相同
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2018-02-28 虚拷贝