[算法][单调栈] [leetcode]316. 去除重复字母

news2024/11/17 5:32:28

在这里插入图片描述

  1. 去除重复字母

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的
字典序最小(要求不能打乱其他字符的相对位置)。

字典序最小:
考虑字符串 a 与 字符串 b,如果字符串 a 在 a 与 b 相异的第一处的字符在字母表上先于对应 b 在此处的字符出现,则称字符串 a 字典序小于 b。
如果 a 或 b 其中较短的字符串为另一个字符串的前半部分,则较短的字符串字典序小于另一个字符串。

示例 1:

输入: s = “bcabc”

输出: “abc”

示例 2:

输入: s = “cbacdcbc”

输出: “acdb”

提示:

1 <= s.length <= 10^4 s由小写英文字母组成

相似题目:该题与1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同

思路:

对于s=cbacdcbc,从左到右遍历其中的字母。

1.s[0]=c。由于只遍历了一个字母,目前已知字典序最小的字符串是c。

2.s[1]=b。如果右边没有字母c,那么s0]=c必须保留;实际上右边还有字母c,我们可以
去掉c,改用b当作目前字典序最小的字符串。

3.s[2]=a。同样的,由于右边还有字母b,我们可以去掉b,改用a当作目前字典序最小的字
符串(下面记作am.s)。

4.s[3]=c。由于c比a大,可以接在a后面,目前ans=ac。

5.s[4]=d。由于d比c大,可以接在c后面,目前ans=acd。

6.s[5]=c。由于acd里面已经有c了,直接跳过。目前ans=acd。

7.s[6]=b。我们发现b比d小,能不能像上面s[1]和s2那样,去掉d替换成b呢?这是不
行的,因为后面没有d了,我们只能老老实实地接在d后面,目前ams=acdb。

8.s[7]=c。由于acdb里面已经有c了,直接跳过。

遍历完毕,我们得到了答案ans=acdb。

你可能会问,怎么知首右边是否还有某个字母x?我们可以在遍历s之前,先统计出每个字母的出
现次数,记到一个哈希表或者数组left中。在遍历s时,减少s[i]的出现次数,也就是把left[s[i]]
减一。如果发现left[x]=0就说明右边没有x了。

具体算法如下

1.统计每个字母的出现次数,记到一个哈希表或者数组lfet中。

2.遍历s,先把left[s[i]]减一。

3.如果s[i]在ans中,直接continue。为了快速判断s[i]是否在ams中,可以创建一个哈希
表或者布尔数组inAns。

4.如果s[i]不在ans中,那么判断s[i]是否小于ans的最后一个字母(记作x),如果s[i]<
x且left [x]>0,那么可以把x从ans中去掉,同时标记inAns [x]=false。

5.反复执行第4步,直到ans为空,或者s[i]>x,或者left[x]=0。

6.把s[i]加到ans未尾,同时标记nAns[s[i]]=true。然后继续遍历s的下一个字母。

7.遍历完s后,返回ans。

题解:

    public class Solustion{
      public String removeDuplicateLetters(String S) {
          
          //特殊判断
          if(null == S){
            return "";
          }
          
          char [] arr = S.toCharArray();
          
          //计算每个字母中出现的次数
          int [] left = new int[26];
          
          for(char c :arr){
              left[c-'a']++;
          }
          
          StringBuilder ans = new StringBuilder(26);
          
          //记录某个字母是否出现过
          boolean[] inAns = new boolean[26];
          
          for(char c : arr){
            //将次数减少
            left[c-'a']--;
            
            //如果字母已经出现过了则继续
            if(inAns[c - 'a']){
              continue;
            }
            
            // 设 x = ans.charAt(ans.length() - 1),
            // 如果 c < x,且右边还有 x,那么可以把 x 去掉,因为后面可以重新把 x 加到 ans 中
            while (!ans.isEmpty() && c < ans.charAt(ans.length() - 1) && left[ans.charAt(ans.length() - 1) - 'a'] > 0) {
                // 标记 x 不在 ans 中
                inAns[ans.charAt(ans.length() - 1) - 'a'] = false; 
                ans.deleteCharAt(ans.length() - 1);
            }
          }
           return ans.toString();
      }
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1665368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb:VsCode创建Web项目

一、Tomcat 先在官网上下载tomcat&#xff0c;解压到自己设定的文件夹。 配置环境变量 path变量配置 系统变量配置 验证服务器开机 二、Maven Maven 是一个基于 Java 的项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理&#xff0c;可以自动下载所需要的包&#x…

关于各类软件下载及使用

文章目录 一、VS Code1、下载2、安装3、使用 二、Dev-C1、下载2、安装3、使用 三、VS20191、下载2、安装3、使用 四、IDEA1、下载2、安装3、使用 五、Fiddler1、下载1.1 官网下载1.2 文件下载 2、安装3、使用 一、VS Code 1、下载 2、安装 3、使用 二、Dev-C 1、下载 2、…

【蚂蚁笔试题汇总】2024-05-11-蚂蚁春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新蚂蚁近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f49…

《超越代码生成:Agentic Reasoning探索研发智能化》——【研发效能·创享大会】

【研发效能创享大会】是由IDCF社区独家举办&#xff0c;这个会议主要聚焦于技术和研发管理&#xff0c;旨在为社区成员提供一个学习与交流的平台&#xff0c;分享技术经验&#xff0c;交流行业见解&#xff0c;促进技术合作与创新&#xff0c;发现并培养人才&#xff0c;推动软…

新能源汽车动力电池浸没式冷却方案介绍与未来趋势

前言 新能源汽车的兴起标志着汽车工业的一次革命&#xff0c;其中动力电池的设计与性能成为了关键。浸没式冷却方案作为一种新兴的技术&#xff0c;为动力电池系统提供了有效的散热解决方案&#xff0c;其在未来的发展趋势备受关注。 一 动力电池浸没式冷却方案介绍 首先&am…

攻防世界-web-command_execution

题目&#xff1a; 原理&#xff1a; | 的作用为将前一个命令的结果传递给后一个命令作为输入 &&的作用是前一条命令执行成功时&#xff0c;才执行后一条命令 方法一&#xff1a; 第一步&#xff1a; 1.打开浏览器&#xff0c;在文本框内输入127.0.0.1 | find / -name…

Qt : 一个超高人气的Node编辑器

真的是很不错的Node编辑器开源项目&#xff0c;基于Qt的图元/场景/视图框架&#xff0c;能做点啥不用我多说。 git地址&#xff1a;https://github.com/paceholder/nodeeditor

分布式链路追踪 Zipkin+Sleuth(8)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…

前端笔记-day02

文章目录 01-无序列表02-有序列表03-定义列表04-表格06-表格-合并单元格07-表单-input08-表单-input占位文本09-表单-单选框10-表单-上传多个文件11-表单-多选框12-表单-下拉菜单13-表单-文本域14-表单-label标签15-表单-按钮16-无语义-span和div17-字体实体19-注册登录页面 01…

每日10亿数据的日志分析系统OOM

背景 一个每日10亿数据的日志清洗系统&#xff0c;主要工作就是从消息队列中消费各种各样的日志&#xff0c;然后对日志进行清洗&#xff0c;例如&#xff1a;用户敏感信息(姓名、手机号、身份证)进行脱敏处理,然后把清理完的数据交付给其他系统使用。 我们项目中&#xff0c;…

有奖调查!!!!!

老子云平台https://www.laozicloud.com/ 如果老子云3D可视化综合服务平台的AMRT展示框架&#xff08;包含SDK、模型优化处理API&#xff09;免费开放给大家&#xff0c;大家愿意。。。。。。。 填写调查问卷&#xff0c;注册老子云账号&#xff0c;调查结束后您将获得100元平台…

2024HW Linux应急响应基础学习

首先展示关于Linux的关键目录&#xff0c;这是应急响应查看的关键&#xff1a; 常用命令 top //查看进程资源的占用情况 ps -aux //查看进程 直接写ps aux也可以 netstat -antpl //查看网络连接 ls -alh /proc/pid //查看某个pid对应的可执行程序 pid记得修改 lsof /…

检测服务器环境,实现快速部署。适用于CRMEB_PRO/多店

运行效果如图&#xff1a; 最近被好多人问&#xff0c;本来运行的好好的&#xff0c;突然swoole就启动不了了。 本工具为爱发电&#xff0c;如果工具正好解决了您的需求。我会很开心 代码如下&#xff1a; """本脚本为爱发电by:网前雨刮器 """…

共享云桌面如何助力企业信息化和数字化?

随着科技的飞速发展&#xff0c;信息化和数字化已经成为企业转型的重要方向。共享云桌面作为一种新兴的信息化工具&#xff0c;正以其独特的优势助力企业实现信息化和数字化的目标。本文将详细探讨共享云桌面如何助力企业信息化和数字化的过程&#xff0c;以及它所带来的效益。…

学习网络安全现在还有前景吗?行业分析报告

如果你现阶段选择入行网络安全&#xff0c;就相当于10年前学IT&#xff0c;当它发展起来的时候&#xff0c;你刚好遇到行业红利期。 网络安全这个职业完全可以改变很多人的人生轨迹。 因为它是个不需要你有多强大的情商&#xff0c;不需要你去学习更多复杂的职场和人际关系技…

2024年618值得安利的数码好物有哪些?年度值得入手的数码清单分享

随着2024年618购物节的到来&#xff0c;各类数码好物纷至沓来&#xff0c;为消费者提供了丰富多样的选择&#xff0c;在这个充满诱惑的购物狂欢中&#xff0c;哪些数码产品值得我们重点关注和入手呢&#xff1f;接下来就让我们一起探索这份年度值得入手的数码清单&#xff0c;分…

图鸟模板-官网:基于Vue 3的前端开发新篇章

一、引言 随着前端技术的飞速发展&#xff0c;企业对于官网的需求也从简单的展示型网站向功能丰富、交互体验良好的方向转变。在这样的背景下&#xff0c;图鸟模板-官网以其基于Vue 3的纯前端开发特性&#xff0c;以及支持微信小程序、支付宝小程序、APP和H5的跨平台能力&…

【贪心算法】哈夫曼编码Python实现

文章目录 [toc]哈夫曼编码不同编码方式对比前缀码构造哈夫曼编码哈夫曼算法的正确性贪心选择性质证明 最优子结构性质证明 总结 Python实现时间复杂性 哈夫曼编码 哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方法&#xff0c;其压缩率通常为 20 % 20\% 20%到 90 % 90\%…

RK3568 学习笔记 : Linux emmc 内核启动 rootfs 根文件系统无法正常挂载问题的分析

问题描述 平台 &#xff1a; NanoPi-R5C 开发板 RK3568 平台。 手动编译的 Linux 内核&#xff0c;结果发现大概率 emmc 无法正常初始化&#xff0c;导致 rootfs 根文件系统无法正常挂载 Linux 内核版本&#xff1a; 6.1 Linux 内核代码位置&#xff1a; https://github.com…

Github图片显示不出来?两步解决!

很多同学可能和我一样&#xff0c;在GitHub中找一些项目或者资料的时候&#xff1b;总是会看到一些图片显示不出来&#xff0c;或者数学公式乱码&#xff1a; 比如这样 还有这样 其实这个主要是因为DNS污染导致的&#xff0c;具体大家可以百度&#xff0c;这边不详细介绍。 解决…