当前位置: 首页 > news >正文

刷题记录第五十一天-去除重复字母

在这里插入图片描述
题目要求的是字典序最小的结果。只需要理解一点就是按大小顺序排列的字符串的字典序就是最小的,如“abcd”这种。
解题思路如下:

  1. 首先明确要使用栈结构,并且是从栈底到栈顶递增,要尽可能保证递增,这样就能保证字典序最小。
  2. 在遍历每个字符时,我们的规则是:如果当前元素大于等于栈顶元素,直接入栈。如果当前元素小于栈顶元素,此时如果将当前元素入栈,会打破顺序。此时如果栈顶元素在后面还会出现(这里就需要一个visit数组记录每个字符最后出现的下标),就删掉这个栈顶元素,保证当前元素入栈后递增不会破坏,这个过程是持续比较。直到当前元素大于等于栈顶元素。如果栈顶元素在后面不会出现,就只能保留这个栈顶元素。
  3. 需要考虑另外一个问题,如果当前元素在栈里面,那么这个元素一定不是某一个顺序字符串的最后一个元素(因为如果出现了顺序被打乱的情况,那么证明前面顺序字符串的最后一个元素在后面肯定不会出现了,所以才会打乱),也就没有替换的必要。因此,如果当前元素在栈里面,就直接跳过这个元素。所以需要有另一个数组last来记录哪些字符在栈里面。
class Solution {
public:string removeDuplicateLetters(string s) {int n=s.size();vector<bool> visited(26);vector<int> last(26);for(int i=0;i<n;i++){last[s[i]-'a']=i;}stack<char> stk;for(int i=0;i<n;i++){if(visited[s[i]-'a'])continue;if(!stk.empty())while(!stk.empty()&&s[i]<stk.top()&&last[stk.top()-'a']>i){visited[stk.top()-'a']=false;stk.pop();}stk.push(s[i]);visited[s[i]-'a']=true;}string result(stk.size(), 'c' );for(int i=stk.size()-1;i>=0;i--){result[i]=stk.top();stk.pop();}return result;}
};

相关文章:

  • 【STL】C++ string基本使用
  • 前端技术的新趋势:React、Vue与Angular的比较
  • 2023 英特尔On技术创新大会直播 |探索视觉AI的无限可能
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • 如何在Linux中查看正在运行的进程以及过滤特定端口和进程名称
  • LVS最终奥义之DR直接路由模式
  • 基于FPGA的简易BPSK和QPSK
  • 65 数学游戏
  • 【delphi11】delphi基础探索【三、基础组件和事件】
  • 巧用map实现springbean的命令模式
  • Python 时间日期处理库函数
  • Gemini 1.0:Google推出的全新AI模型,改变生成式人工智能领域的游戏规则!
  • 做一个wiki页面是体验HTML语义的好方法
  • 网络基础篇【网线的制作,OSI七层模型,集线器和交换机的介绍,路由器的介绍与设置】
  • 第一周:AI产品经理跳槽准备工作
  • 【css3】浏览器内核及其兼容性
  • Android单元测试 - 几个重要问题
  • gcc介绍及安装
  • k8s如何管理Pod
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 批量截取pdf文件
  • 三分钟教你同步 Visual Studio Code 设置
  • 深入浏览器事件循环的本质
  • 消息队列系列二(IOT中消息队列的应用)
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (四)图像的%2线性拉伸
  • (转)平衡树
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Net下的签名与混淆
  • .Net小白的大学四年,内含面经
  • .NET与 java通用的3DES加密解密方法
  • .net与java建立WebService再互相调用
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @Transactional类内部访问失效原因详解
  • [CERC2017]Cumulative Code
  • [echarts] y轴不显示0
  • [ffmpeg] x264 配置参数解析
  • [iOS]-NSTimer与循环引用的理解
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • [LeetCode][LCR178]训练计划 VI——使用位运算寻找数组中不同的数字
  • [Linux] 常用命令--版本信息/关机重启/目录/文件操作
  • [NOIP 2003] 栈(三种方法:DP、数论、搜索)
  • [NOIP2013]华容道
  • [NowCoder]牛客OI周赛3
  • [OS] linux常见问题汇总
  • [Paper]Cardiologist-Level Arrhythmia Detection with Convolutional Neural Networks
  • [架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库