力扣—316去除重复字母

题目描述

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

 

示例 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"))

 

你可能感兴趣的:(算法)