当前位置: 首页 > 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();}
}

关键点

  • 怎么保证结果的字典序最小
  • 怎么保证原有字符串中的字母在结果中都出现且只出现了一次
http://www.lryc.cn/news/402521.html

相关文章:

  • Xcode进行真机测试时总是断连,如何解决?
  • Redis的使用(五)常见使用场景-分布式锁实现原理
  • AppML 案例:Products
  • 数据库端口LookUp功能:从数据库中获取并添加数据到XML
  • 视频联网共享平台LntonCVS视频监控汇聚平台视频云解决方案
  • 深入探索Python中的`__slots__`类属性:优化内存与限制灵活性
  • llama 2 改进之 RMSNorm
  • Matlab【光伏预测】基于雪融优化算法SAO优化高斯过程回归GPR实现光伏多输入单输出预测附代码
  • ES6 模块
  • 谷粒商城-全文检索-ElasticSearch
  • Java的LinkedHashMap 源码解析
  • Linux系统及常用指令
  • Mac Electron 应用如何进行签名(signature)和公证(notarization)?
  • 【C++ | 抽象类】纯虚函数 和 抽象基类,为什么需要抽象基类
  • DP(7) | 打家劫舍① | Java | LeetCode 198, 213, 337 做题总结(未完)
  • 人工智能算法工程师(中级)课程17-模型的量化与部署之剪枝技巧与代码详解
  • JavaScript 实例:掌握编程技巧
  • 自己做小项目时,配置的Maven需要用阿里云私服加速Jar包的下载
  • Linux笔记之time命令测量命令的执行时间
  • 《基于 CDC、Spark Streaming、Kafka 实现患者指标采集》
  • 重要的单元测试
  • 什么是diff算法?
  • BUUCTF逆向wp [MRCTF2020]Transform
  • 前端下载文件流 出现乱码 解决方案
  • Linux/Windows 系统分区
  • C/C++ xml库
  • UniVue@v1.5.0版本发布:里程碑版本
  • 在 Windows 上开发.NET MAUI 应用_2.生成你的第一个应用
  • 配置SMTP服务器的要点是什么?有哪些限制?
  • 图形渲染基础-Unity渲染管线介绍