时间:2021-03-01
题目地址:https://leetcode-cn.com/problems/remove-duplicate-letters/ 【与1081一致】
题目难度:Medium
题目描述:
给你一个字符串 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 由小写英文字母组成
思路1:细分问题,各个击破
关键点:
- 去重--set()
- 不能打乱字符的相对位置--栈结构
- 保持字典序最小--判断一下是否需要删除之前比当前大的元素,类似单调栈,如果后边还有可以删除,否则跳过,使用collections.Counter会快一点
代码段1:通过
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
# 栈
stack = []
# 字典
instack = set(s)
# 统计元素个数
# count = {}
# for i in s:
# count[i] = count.setdefault(i, 0) + 1
count = collections.Counter(s)
for i in s:
count[i] -= 1
if i in stack:
continue
while stack and stack[-1] > i and count[stack[-1]] > 0:
instack.discard(stack.pop())
stack.append(i)
instack.add(i)
return ''.join(stack)
总结:
- 号称数组去重最难的一道题,真的不容易想出来,加油吧