题目描述
给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入: "bcabc"
输出: "abc"
示例 2:
输入: "cbacdcbc"
输出: "acdb"
解题思路
看到这种字符串处理的题目一般使用栈比较合适,这里要保持字典序最小,首先可以维护一个所有字母次数的字典,每次加入一个新的元素,先判断这个元素是否再栈中,如果在就continue,如果不在,就判断这个字母和栈顶元素的字典序大小。如果比栈顶元素小,还需要判断栈顶元素还剩下多少个,只有剩下大于0个才能把这个元素弹出(否则弹出了后面就再也找不到了)。
from collections import Counter class Solution: def removeDuplicateLetters(self, s): stack = [] if not s: return "" remain_counter = Counter(s) for c in s: if c not in stack: while stack and c < stack[-1] and remain_counter[stack[-1]] > 0: stack.pop() stack.append(c) remain_counter[c] -= 1 return "".join(stack) S = Solution() print(S.removeDuplicateLetters("cbacdcbc"))