leetcode_316 去除重复字母

161 阅读1分钟

要求

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

注意:该题与 1081 leetcode-cn.com/problems/sm… 相同

示例 1:

输入:s = "bcabc"
输出:"abc"

示例 2:

输入:s = "cbacdcbc"
输出:"acdb"

核心代码

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        from collections import Counter
        count_alpha = Counter(s)
        res,res_set = [],set()
        for alpha in s:
            if alpha in res_set:
                count_alpha[alpha] -= 1
            else:
                while res and alpha < res[-1] and count_alpha[res[-1]] > 1:
                    last = res.pop()
                    res_set.remove(last)
                    count_alpha[last] -= 1
                res.append(alpha)
                res_set.add(alpha)
        return "".join(res)

image.png

重点问题

解题思路:

我们统计字母的个数,我们使用一个列表用来保存最终排序后的结果,我们使用集合来存储那些字母使用过了,核心代码while res and alpha < res[-1] and count_alpha[res[-1]] > 1,就是我们新来一个字母,我们想把她加入列表中,他比原始列表中的最后一个字母小,同时,最后一个字母的统计数字大于一个,说明后面还是有这个字母,删除列表中这个字母和集合中这个字母,来保证字母排序但同时对只有一个字母的情况,保证相对位置不变,比较好的一道题。