文章目录

  • 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. 去除重复字母相关推荐

  1. 316. 去除重复字母

    链接:316. 去除重复字母 题解:https://leetcode-cn.com/problems/remove-duplicate-letters/solution/qu-chu-zhong-fu ...

  2. LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 LC 316: 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). ...

  3. leetcode 316. 去除重复字母(单调栈)

    给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 注意:该题与 1081 https://leetcode-c ...

  4. leetcode 316. Remove Duplicate Letters | 316. 去除重复字母(单调栈解法)

    题目 https://leetcode.com/problems/remove-duplicate-letters 题解 关于什么是"字典序" 字典序,换成数字更好理解一点 a:1 ...

  5. 20200213:去除重复字母(leetcode316)

    去除重复字母 题目 思路与算法 代码实现 题目 思路与算法 首先对字符串进行遍历,将当前字符串依次入栈, 注意入栈的条件: 新入栈的元素在栈内没有出现过,必须是未出现过的元素 新入栈的元素如果比栈顶元 ...

  6. 力扣- -去除重复字母

    力扣- -去除重复字母 文章目录 力扣- -去除重复字母 一.题目描述 二.分析 三.代码 四.问题描述 五.代码 一.题目描述 二.分析 题目的要求总结出来有三点: 要求一.要去重. 要求二.去重字 ...

  7. 316 Remove Duplicate Letters 去除重复字母

    给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果. 例如: 给定 "bcabc" 返回 &quo ...

  8. 贪心+单调栈——去除重复字母(Leetcode 316)

    题目选自Leetcode 316 第一步当然是好好读题~ 有的人读着很快啊,啪 一下 哦原来就是个排序 哒哒哒一分钟解决战斗,欸 怎么全错了. 再仔细一看,原来少了重要的条件--要求不能打乱其他字符的 ...

  9. 316. Remove Duplicate Letters 去除重复字母

    给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 注意:该题与 1081 https://leetcode-c ...

最新文章

  1. CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四)
  2. Spring Boot 部署与后台运行服务配置
  3. 二:数据是用二进制数表示的
  4. 扩展欧几里得算法及其简单应用
  5. pcshare完美版
  6. 程序猿一些实用学习网址
  7. linux中常用的60个命令及作用详解
  8. Need assistance with accessing your developer account
  9. android 统一推送平台,工信部实验室成立安卓统一推送联盟:推送服务将实现统一...
  10. 日语流行口语极短句2
  11. 双方API交互:签名及验证-- (AK/SK)认证的实现
  12. 17 -> 详解 openWRT 的 gpio 配置关系说明
  13. 【FFmpeg】通过编解码ID(AV_CODEC_ID_*)获取编解码器AVCodec指针的过程分析
  14. TS: 无法找到模块“xxxx”的声明文件。
  15. 挑战杯三创互联网+创青春等创新创业类竞赛国家级作品案例模板全套资料分享
  16. 创维电视怎么安装鸿蒙系统,创维健康wifi王怎样安装软件?学会这招马上解决...
  17. 抓取服务器作业文档不存在,易飞ERP问题解答.doc
  18. Windows 10磁盘修复工具Chkdsk新增的命令有哪些?赶快收藏
  19. 刷脸支付有效的风险监控和预防措施
  20. Unity中使用SimpleWaypointSystem控制物体移动

热门文章

  1. IOT网关开发受难记-(一) 2022/05/13
  2. 英语日常口语对话(7)
  3. Swift - lazy 修饰符和lazy 方法
  4. MySQL数据库介绍及特点
  5. 【linux】将Linux里的文件上传 到gitee仓库
  6. 知乎采集手机,轻松搞定信息收集
  7. elastic官网文档翻译来.1
  8. VMware虚拟机网络连接的3种方式
  9. 音乐app用户推荐系统构建_一款专门给用户推荐动听音乐的音乐期刊类的应用。画面极简优美...
  10. Python到底能做什么