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