去除重复字母

题目链接

去除重复字母

题目描述

注意点

  • 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://xiahunao.cn/news/3246508.html

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

相关文章

LinuxShell编程1———shell基础命令

文章目录 前言 一、shell基础知识 1、shell概念 2、Shell的功能 接收&#xff1a;用户命令 调用&#xff1a;相应的应用程序 解释并交给&#xff1a;内核去处理 返还&#xff1a;内核处理结果 3、Shell种类&#xff08;了解&#xff09; 3.1、MS-DOS 3.2、Windows的…

Microsoft Edge(简称Edge)

Microsoft Edge&#xff08;简称Edge&#xff09;是一款由微软开发的网页浏览器&#xff0c;它为用户提供了许多便捷的功能和选项。以下是Edge浏览器的使用方法&#xff1a; 一、基本使用方法 打开Edge浏览器&#xff1a; 可以在Windows的开始菜单中找到“Microsoft Edge”并点…

探索编程世界的乐趣:《C++青少年趣味编程108例》

&#x1f482; 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

Python学习:实现Python项目并学习如何进行(附70个项目源码)

实现Python项目并学习如何进行&#xff0c;是一个循序渐进的过程&#xff0c;涵盖了多个方面&#xff0c;包括基础知识的学习、技能的提升、项目的规划和实施等。以下是一个基本的指南&#xff0c;帮助你开始学习并实现Python项目&#xff1a; 1. 学习Python基础知识 语法与基…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第二篇 Linux系统编程篇-第三十三章 库的制作与使用

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

NDK R25b 交叉编译FFMpeg4,项目集成,附库下载地址

1.准备工作 文件下载&#xff1a; NDK R25b下载地址&#xff1a;Android NDK历史版本下载网址 - 君*邪 - 博客园 (cnblogs.com) FFmpeg4.4.4 下载地址&#xff1a;https://ffmpeg.org/releases/ffmpeg-4.4.4.tar.xz 环境配置&#xff1a; 本次编译环境是在PC虚拟机中使用U…

BigMarker-抽奖前置规则过滤

需求 在我们的流程设计中&#xff0c;用户执行抽奖时会判断是否已经超过N积分&#xff0c;如果超过N积分则可以在限定范围内进行抽奖。同时如果用户是黑名单范围的羊毛党用户&#xff0c;则只返回固定的奖品ID 模型 整个规则来说&#xff0c;分为抽奖前、抽奖中、抽奖后&#…

无人机之机型区别与应用领域

一、多旋翼无人机 特点&#xff1a;多旋翼无人机依靠产生升力以平衡飞行器的重力&#xff0c;通过改变每个旋翼的转速来控制飞行姿态&#xff0c;能够悬停和垂直起降。他们具备体积小、重量轻、噪音小、隐蔽性好的特点&#xff0c;操作灵活且易于维护。 应用&#xff1a;多旋…

数据库(创建数据库和表)

目录 一&#xff1a;创建数据库 二&#xff1a;创建表 2.1&#xff1a;创建employees表 2.2&#xff1a;创建orders表 2.3&#xff1a;创建invoices表 一&#xff1a;创建数据库 mysql> create database mydb6_product; Query OK, 1 row affected (0.01 sec) mysql&g…

排序——归并排序及排序章节总结

前面的文章中 我们详细介绍了排序的概念&#xff0c;插入排序&#xff0c;交换排序与选择排序&#xff0c;大家可以通过下面的链接再去学习&#xff1a; ​​​​​​排序的概念及插入排序 交换排序 选择排序 这篇文章就详细介绍一下另一种排序算法&#xff1a;归并排序以及…

鼠标宏编辑有什么作用?通用鼠标宏软件下载

你知道鼠标宏编辑吗&#xff1f;鼠标宏编辑是电脑鼠标连点器内一种常用功能。用户通过鼠标宏编辑可以很好提高效率。本文将深入探讨鼠标宏编辑的定义、作用及其在不同领域的应用&#xff0c;带您了解它的重要性和实际价值。并整理了2024年最新款的6大好用鼠标宏软件&#xff0c…

FPGA实训报告DAY 1(Verilog HDL)

实习日志与总结 日期&#xff1a;2024 年 7 月 10 日 星期三 姓名&#xff1a;XXX 一、实习日志 上午 9:00 - 9:30 按时到达工位&#xff0c;参加部门早会&#xff0c;了解了今天的实习任务和目标&#xff0c;即初步学习 FPGA 简介和 Verilog 基础语法知识。 9:30 - 10:30…

大数据基础:Doris重点架构原理

文章目录 Doris重点架构原理 一、Apache Doris介绍 二、Apache Doris使用场景 三、Apache Doris架构原理 四、Apache Doris 特点 Doris重点架构原理 一、Apache Doris介绍 基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff…

嵌入式人工智能(7-树莓派4B的IIC总线连接OLED显示中文与图片)

1、IIC总线 IIC总线&#xff08;Inter-Integrated Circuit&#xff09;是一种串行通信总线&#xff0c;也被称为I2C总线。它由飞利浦&#xff08;Philips&#xff09;公司在1980年代开发&#xff0c;用于连接微处理器和外部设备。 IIC总线使用两根信号线&#xff1a;SDA&…

【JavaScript 算法】树的遍历:前序、中序与后序

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、前序遍历&#xff08;Preorder Traversal&#xff09;前序遍历的步骤前序遍历的JavaScript实现 二、中序遍历&#xff08;Inorder Traversal&#xff09;中序遍历的步骤中序遍历的JavaScript实现 三、后序遍历&#xff…

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现&#xff08;只会出现在选择题&#xff0c;考察代码的概率不大&#xff09; 三. 手算next数组四. KMP算法的进一步优化4…

springboot2.x AOP 默认使用Cglib 源码

一、背景 在 SpringBoot 2.x AOP中会默认使用Cglib来实现&#xff0c;但是Spring5中默认还是使用jdk动态代理。Spring AOP 默认使用 JDK 动态代理&#xff0c;如果对象没有实现接口&#xff0c;则使用 CGLIB 代理。也可以强制使用 CGLIB 代理。springboot默认使用cglib实现代码…

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#x…

使用assembly插件来将外部文件夹打进jar包

目录&#xff1a; 1、pom文件的配置2、新建assembly的描述文件3、maven打包 1、pom文件的配置 <!--maven构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</ar…

python自动化之用flask校验接口token(把token作为参数)

用到的库&#xff1a;flask 实现效果: 写一个接口&#xff0c;需要token正确才能登录 代码&#xff1a; # 导包 from flask import Flask,request,jsonify,json # 创建一个服务 appFlask(__name__) # post请求&#xff0c;路径&#xff1a;/query app.route(/query, met…