LeetCode 练习——316. 去除重复字母
文章目录
- 1.题目描述
- 2.思路
- 2.1 代码
- 2.2 测试结果
- 3.总结
1.题目描述
去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = "bcabc"
输出:"abc"
示例 2:
输入:s = "cbacdcbc"
输出:"acdb"
2.思路
2.1 代码
从题目中可以分析出题目要求主要有以下三点:
- 去除重复字母
- 保留字符串字典序最小
- 不能打乱字符相对位置
考虑这两点,可以使用单调栈来进行解答,最后得到的栈中元素即为答案。使用单调栈时,遍历字符串将字符压入栈中。在遍历字符时,需要对栈顶元素进行弹出,弹出条件有以下四个:
- 栈不为空
- 栈顶元素大于当前字符(确保字典序小)
- 字符串中后面部分还有当前字符(确保每个字符都存在,不会出现字符多删的情况)
- 栈中不包含当前字符(确保字符相对位置不变),并且只有当栈中没有当前字符时,才会压入栈中
综合以上思路,使用三个数组来进行作答,分别是 stack 栈数组、统计字符串中字符使用个数的 count 数组、统计栈中字符个数的数字 stackCount。在每次入栈时,字符在 stackCount 对应位置上的计数加 1 ;在每次弹出栈时,字符在 stackCount 对应位置上的计数减 1 。每次遍历将字符对应 count 中位置计数减 1 。遍历完成之后弹出栈中所有元素,并使用 StringBuilder 进行拼接。代码如下:
class Solution {public String removeDuplicateLetters(String s) {int[] count = new int[26];for (int i = 0; i < s.length(); i++) {count[s.charAt(i) - 'a']++;}char[] stack = new char[s.length()];int[] stackCount = new int[26];int index = -1;for (int i = 0; i < s.length(); i++) {while (index != -1 && stack[index] > s.charAt(i) && count[stack[index] - 'a'] > 0 && stackCount[s.charAt(i) - 'a'] == 0) {stackCount[stack[index] - 'a']--;index--;}if (stackCount[s.charAt(i) - 'a'] == 0) {stack[++index] = s.charAt(i);stackCount[s.charAt(i) - 'a']++;}count[s.charAt(i) - 'a']--;}StringBuilder builder = new StringBuilder();while (index != -1) {builder.append(stack[index--]);}return builder.reverse().toString();}
}
2.2 测试结果
通过测试
3.总结
- 通过分析题目,考虑使用单调栈进行解答
- 这道题目比较绕,并且入栈和出栈的条件比较多
- 使用数组来存放字符剩余情况和栈中使用字符情况,能减少程序耗时
- 只有在栈中不包含当前字符时,才将字符入栈
LeetCode 练习——316. 去除重复字母相关推荐
- 316. 去除重复字母
链接:316. 去除重复字母 题解:https://leetcode-cn.com/problems/remove-duplicate-letters/solution/qu-chu-zhong-fu ...
- LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)
文章目录 1. 题目 2. 解题 1. 题目 LC 316: 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). ...
- leetcode 316. 去除重复字母(单调栈)
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 注意:该题与 1081 https://leetcode-c ...
- leetcode 316. Remove Duplicate Letters | 316. 去除重复字母(单调栈解法)
题目 https://leetcode.com/problems/remove-duplicate-letters 题解 关于什么是"字典序" 字典序,换成数字更好理解一点 a:1 ...
- 20200213:去除重复字母(leetcode316)
去除重复字母 题目 思路与算法 代码实现 题目 思路与算法 首先对字符串进行遍历,将当前字符串依次入栈, 注意入栈的条件: 新入栈的元素在栈内没有出现过,必须是未出现过的元素 新入栈的元素如果比栈顶元 ...
- 力扣- -去除重复字母
力扣- -去除重复字母 文章目录 力扣- -去除重复字母 一.题目描述 二.分析 三.代码 四.问题描述 五.代码 一.题目描述 二.分析 题目的要求总结出来有三点: 要求一.要去重. 要求二.去重字 ...
- 316 Remove Duplicate Letters 去除重复字母
给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果. 例如: 给定 "bcabc" 返回 &quo ...
- 贪心+单调栈——去除重复字母(Leetcode 316)
题目选自Leetcode 316 第一步当然是好好读题~ 有的人读着很快啊,啪 一下 哦原来就是个排序 哒哒哒一分钟解决战斗,欸 怎么全错了. 再仔细一看,原来少了重要的条件--要求不能打乱其他字符的 ...
- 316. Remove Duplicate Letters 去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 注意:该题与 1081 https://leetcode-c ...
最新文章
- CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四)
- Spring Boot 部署与后台运行服务配置
- 二:数据是用二进制数表示的
- 扩展欧几里得算法及其简单应用
- pcshare完美版
- 程序猿一些实用学习网址
- linux中常用的60个命令及作用详解
- Need assistance with accessing your developer account
- android 统一推送平台,工信部实验室成立安卓统一推送联盟:推送服务将实现统一...
- 日语流行口语极短句2
- 双方API交互:签名及验证-- (AK/SK)认证的实现
- 17 -> 详解 openWRT 的 gpio 配置关系说明
- 【FFmpeg】通过编解码ID(AV_CODEC_ID_*)获取编解码器AVCodec指针的过程分析
- TS: 无法找到模块“xxxx”的声明文件。
- 挑战杯三创互联网+创青春等创新创业类竞赛国家级作品案例模板全套资料分享
- 创维电视怎么安装鸿蒙系统,创维健康wifi王怎样安装软件?学会这招马上解决...
- 抓取服务器作业文档不存在,易飞ERP问题解答.doc
- Windows 10磁盘修复工具Chkdsk新增的命令有哪些?赶快收藏
- 刷脸支付有效的风险监控和预防措施
- Unity中使用SimpleWaypointSystem控制物体移动