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

去除重复字母

题目链接

去除重复字母

题目描述

注意点

  • s 由小写英文字母组成
  • 1 <= s.length <= 10^4
  • 需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)

解答思路

  • 本题与移掉 K 位数字类似,需要注意的是,并不是每个字母都能被移除,而是要移除重复字母,保证字符串中每个字母都只出现了一次
  • 又因为要保证结果的字典序最小,要尽可能保证前面的字母更小,所以要尽可能保证字符串是严格递增的(没办法保证一定递增,部分字母不重复无法去除)
  • 对于任意一个位置处的字母ch,有以下几种情况:
    • 如果ch已经加入到结果中,因为字母不能重复,则不会继续加入到结果中
    • 如果ch还未加入到结果中,且此时结果末尾处的字母小于ch,则直接将ch加入到结果中
    • 如果ch还未加入到结果中,且此时结果末尾处的字母大于ch,且剩余字符串中已经没有末尾处的字母,则不能弹出末尾字母(保证末尾字母有出现在结果中),直接将ch加入到结果中
    • 如果ch还未加入到结果中,且此时结果末尾处的字母大于ch,且剩余字符串中还有末尾处的字母,则需要弹出末尾字母,直到满足上面两个要求为止,再将ch加入到结果中

代码

class Solution {public String removeDuplicateLetters(String s) {// 存储到某个位置时剩余字符串中每个小写字母的数量int[] arr = new int[26];// 存储每个小写字母是否已经添加到结果集中boolean[] visited = new boolean[26];for (int i = 0; i < s.length(); i++) {arr[s.charAt(i) - 'a']++;}StringBuilder sb = new StringBuilder();for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);// 该字母如果已经加入到结果中,不能重复,则不做考虑if (visited[ch - 'a']) {arr[ch - 'a']--;continue;}// 末尾字母大于c,且后方还有末尾字母,则弹出末尾字母while (sb.length() > 0 && sb.charAt(sb.length() - 1) > ch && arr[sb.charAt(sb.length() - 1) - 'a'] > 0) {visited[sb.charAt(sb.length() - 1) - 'a'] = false;sb.deleteCharAt(sb.length() - 1);}sb.append(ch);visited[ch - 'a'] = true;arr[ch - 'a']--;}return sb.toString();}
}

关键点

  • 怎么保证结果的字典序最小
  • 怎么保证原有字符串中的字母在结果中都出现且只出现了一次

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python酷库之旅-第三方库Pandas(027)
  • 分类题解清单
  • 网络请求之urllib.request的使用(Get方式)
  • 数组 704.二分查找法
  • which 命令在Linux中是一个快速查找可执行文件位置的工具
  • el-table的selection多选表格改为单选
  • 【Diffusion学习】【生成式AI】Stable Diffusion、DALL-E、Imagen 背後共同的套路
  • 美式键盘 QWERTY 布局的来历
  • TS 入门(七):TypeScript模块与命名空间
  • Unity宏和编辑器
  • 基础动态规划题目基础动态规划题目
  • Java 快速入门学习 -- Day 2
  • 【持续集成_06课_Jenkins高级pipeline应用】
  • Java常用的API_02(正则表达式、爬虫)
  • 【教学类-67-02】20240716毛毛虫ABB排序
  • [数据结构]链表的实现在PHP中
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Cumulo 的 ClojureScript 模块已经成型
  • Facebook AccountKit 接入的坑点
  • idea + plantuml 画流程图
  • JAVA SE 6 GC调优笔记
  • python学习笔记-类对象的信息
  • quasar-framework cnodejs社区
  • WebSocket使用
  • win10下安装mysql5.7
  • 诡异!React stopPropagation失灵
  • 正则与JS中的正则
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #Java第九次作业--输入输出流和文件操作
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (简单) HDU 2612 Find a way,BFS。
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (转)JAVA中的堆栈
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .net core 依赖注入的基本用发
  • .net dataexcel 脚本公式 函数源码
  • .net 按比例显示图片的缩略图
  • .sys文件乱码_python vscode输出乱码
  • /tmp目录下出现system-private文件夹解决方法
  • @component注解的分类
  • @Pointcut 使用
  • @vue/cli脚手架
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [iOS]把16进制(#871f78)颜色转换UIColor
  • [Modbus] Modbus协议开发-基本概念(一)