前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >leetcode 每日一题:316. 去除重复字母

leetcode 每日一题:316. 去除重复字母

作者头像
用户7685359
发布于 2020-12-22 07:38:34
发布于 2020-12-22 07:38:34
70900
代码可运行
举报
文章被收录于专栏:FluentStudyFluentStudy
运行总次数:0
代码可运行

leetcode 每日一题:316. 去除重复字母:https://leetcode-cn.com/problems/remove-duplicate-letters/

一起刷题吧

一、题目分析

输入:字符串 输出:去重后的字符串,要求保留原有字符的相对顺序,且得到的字符串最小 难度:中等 标签:栈、贪心

示例 1: 输入:s = "bcabc" 输出:"abc"

示例 2: 输入:s = "cbacdcbc" 输出:"acdb"

二、参考代码

这个题个人认为是一个数学题,有一个基本原则:

比如当前字符串是 cb

当往后追加一个字符 a 时,此时 a 是比 c,b 都要小的。即显然越小的数值放在前面,最终的数值越小,那怎么决定前面的数值是否需要保留呢?(因为既要最小,也要全都有)

其实也很简单,只要前面的数值在后面仍然有可能出现即可

因此整个题目可以转化如下几步:

  1. 依次遍历字符串的字符,同时用一个中间变量存储当前位置以前去重后得到的最小字符串
  2. 如果当前字符串比前面字符串的结尾要小,则说明需要判断前面的字符串是否需要丢弃
  3. 判断是否需要丢弃的标准即这个字符在之后是否还会出现

从上面的步骤可以看出,我们还需要知道每个字符串当前还剩余的次数。这里通过 pythoncollections 包下的 Counter 很容易得到。

参考代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter

# https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters/ 和这个题一模一样


class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        if not s:
            return s

        # 基本思想,首先统计每个字母出现的次数
        # 依次填入,每次可选择当前填入之后,前面的元素是丢弃还是保留
        # 如果前面的元素后面还有剩余,即剩余出现次数大于等于1,且前面的元素比当前元素都要大,则把前面的元素移除
        cs = Counter(s)
        stack = []
        uniq = set()
        for c in s:
            if c in uniq:
                cs[c] = cs[c] - 1
                continue
            # 因为还要达到去重的效果,所以这里最后一个判断需要加uniq
            while stack and cs[stack[-1]] >= 1 and stack[-1] >= c:
                uniq.remove(stack.pop())
            cs[c] = cs[c] - 1
            stack.append(c)
            uniq.add(c)
        return "".join(stack)

从题解中,可以看到类似的一系列题目,都是循环插入,然后判断前面的值是否需要丢弃的。我也是参考这个题解做出的这个题目。

这里给出题解的链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://leetcode-cn.com/problems/remove-k-digits/solution/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-5/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FluentStudy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
leetcode刷题(106)——316. 去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
老马的编程之旅
2022/06/22
2820
LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
Michael阿明
2021/02/19
8920
leetcode 每日一题:387. 字符串中的第一个唯一字符
https://leetcode-cn.com/problems/first-unique-character-in-a-string/
用户7685359
2021/01/08
3440
【一天一大 lee】去除重复字母 (难度:中等) - Day20201220
s 中元素逐个入栈,如果遇到 Unicode 较小的元素,尽量将其放大栈底部 (如果后续还有栈内已经排列的原则,则出栈让 Unicode 较小的元素先入栈)
前端小书童
2021/01/05
4070
leetcode 每日一题:389. 找不同
leetcode 每日一题:389. 找不同:https://leetcode-cn.com/problems/find-the-difference/
用户7685359
2020/12/22
3630
LeetCode-316. 去除重复字母&&1081.不同字符的最小子序列(java)
给你一个字符串 ​​s​​ ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
bug菌
2023/05/27
2480
LeetCode-316. 去除重复字母&&1081.不同字符的最小子序列(java)
LeetCode - 有效的字母异位词
LeetCode第242题,难度简单。看到这个题目,我是楞了下的,因为需要重新去看一看,字母异位词是个什么概念。
晓痴
2019/10/08
4380
LeetCode - 有效的字母异位词
啊这,一道数组去重的算法题把东哥整不会了…
想啥呢?labuladong 怎么可能被整不会?只是东哥又发现了一个有趣的套路,所以写了篇文章分享给大家~
labuladong
2021/09/23
6570
​LeetCode刷题实战76:最小覆盖子串
https://leetcode-cn.com/problems/minimum-window-substring/
程序员小猿
2021/01/20
5510
​LeetCode刷题实战76:最小覆盖子串
LeetCode - 有效的括号
LeetCode第20题,难度简单。因为有些是中文网做的,有些是之前英文网做的,所以有些题目虽然内容一样,但是题目序号是不一样的,我这里采用的是中文网的题目序号。
晓痴
2019/08/22
4520
LeetCode - 有效的括号
LeetCode刷题总结 -- 数组篇
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
看、未来
2020/08/26
5740
LeetCode刷题总结 -- 数组篇
kubernetes源码贡献者带你刷14道leetcode
巴菲特的双目标清单系统,基本方法是列两个清单,一个是职业生涯最重要的目标(不超过5个),另一个是比较重要的目标。对于比较重要的目标,要像躲避瘟疫一样的去躲避它们,不投入任何的时间和精力,把这些资源花在最重要的目标上。
王炸
2019/10/30
8550
kubernetes源码贡献者带你刷14道leetcode
003. 无重复字符的最长子串 | Leetcode题解
题目要求连续, 我们考虑使用滑动窗口。而这道题就是窗口大小不固定的滑动窗口题目,然后让我们求满足条件的窗口大小的最大值,这是一种非常常见的滑动窗口题目。
苏南
2020/12/16
5470
003. 无重复字符的最长子串 | Leetcode题解
String - 316. Remove Duplicate Letters
Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
ppxai
2020/09/23
2590
LeetCode - 宝石与石头&转换成小写字母
LeetCode第771题,难度简单;LeetCode第709题,难度简单...这两题实在是很简单,所以我就只能把两题放在一起了。
晓痴
2019/08/22
5010
LeetCode - 宝石与石头&转换成小写字母
242. 有效的字母异位词
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
Regan Yue
2022/09/23
1990
242. 有效的字母异位词
LeetCode - 反转字符串中的单词③
LeetCode第557题,难度是简单,一个月三周以前刷的题目。突然意识到,我真的已经又是一个月没有写过LeetCode了,又变懒了,勤奋果然大都是暂时的。
晓痴
2019/07/24
1.7K0
LeetCode - 反转字符串中的单词③
LeetCode - 删除最外层的括号
原题地址:https://leetcode-cn.com/problems/remove-outermost-parentheses/
晓痴
2019/08/16
7750
LeetCode - 删除最外层的括号
笨方法刷 leetcode(一)
最近在看leetcode,并且正在上面刷一些简单级别的题目(不过说真的,这些题真的简单吗??或许是我太菜,有些感觉也很难
冰霜
2022/03/19
6210
笨方法刷 leetcode(一)
LeetCode - 唯一摩尔斯密码词
LeetCode第804题,难度简单。莫尔斯码,记是记不住的,但是理解还是能够理解的。
晓痴
2019/08/09
4460
LeetCode - 唯一摩尔斯密码词
推荐阅读
相关推荐
leetcode刷题(106)——316. 去除重复字母
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验