去除重复字符(同最小字符串)——华为算法机试

题目

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

示例

示例 1:

输入:s = "bcabc"
输出:"abc"
示例 2:

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

提示:

1 <= s.length <= 104
s 由小写英文字母组成

解题思路

去除重复字符谁不会呀,但既要输出最小的字典序,又要不能打乱原来的相对位置。

  • 不管怎样,首先先统计出来各个字符出现次数,记住collections.Counter(),生成一个字典

  • 顺着遍历每个字符,遍历过出现次数就-1

  • 如果当前出现次数>0,就要判断是否丢弃这个字符,为保证字典序最小,如果下一个进栈元素比这个字符小,那么就把这个元素剔除

代码实现

class Solution(object):
    def removeDuplicateLetters(self, s):
        """
        :type s: str
        :rtype: str
        """
        stack = []
        remain_counter = collections.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)

参考leetcode某位大佬题解

你可能感兴趣的:(技术岗刷题汇总,python,华为)