leetcode_316. 去除重复字母

举报
悲恋花丶无心之人 发表于 2021/02/03 00:00:18 2021/02/03
2.3k+ 0 0
【摘要】 文章目录 一、题目内容二、解题思路三、代码 一、题目内容 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。 注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of...


一、题目内容

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同

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

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

提示:
1 <= s.length <= 104
s 由小写英文字母组成

二、解题思路

每次查找字符在s中最后出现的位置,并找到最小值,这样的话就知道哪个字母出现次数少,并且从这个最小位置往前找最小的字母,把它添加到结果集里,然后从这个最小字母后所有和这个字母一样的字符都删除了, 然后在剩下的s中再按照这样的方法找即可。

例如:s = “cbacdcb”
1.s_index: [7, 6, 2, 7, 4, 7, 6, 7]
location: 2
位置2之前的字符串"cba"中最小的字母是’a’
res: a
删除最小字母后的字符串: cdcbc

2.s_index: [4, 1, 4, 3, 4]
location: 1
位置1之前的字符串"cd"中最小的字母是’c’
res: ac
删除最小字母后的字符串: db

3.s_index: [0, 1]
location: 0
位置0之前的字符串"d"中最小的字母是’d’
res: acd
删除最小字母后的字符串: b

4.s_index: [0]
location: 0
位置0之前的字符串"b"中最小的字母是’b’
res: acdb
删除最小字母后的字符串:

因此res是acbd

三、代码

class Solution: def removeDuplicateLetters(self, s: str) -> str: res = "" while s: s_index = list(map(s.rindex, s)) location = min(s_index) before_location_min = min(s[:location + 1]) res += before_location_min s = s[s.index(before_location_min):].replace(before_location_min, "") return res if __name__ == '__main__': ss = "cbacdcbc" s = Solution() ans = s.removeDuplicateLetters(ss) print(ans)

  
 

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/111468506

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。