[LeetCode]316. Remove Duplicate Letters

316. Remove Duplicate Letters

题意:删除重复的字母,同时还要要求删除后的结果是最小的。

思路:利用贪心的思想,需要维持一个最小的字符串,如果遇到当前字符在后面还存在的话则不管;如果遇到当前字符比之前记录的要小的话则加入;如果遇到当前字符是只出现一次的则加入;

暴力

top和idx分别记录着较小字符和它所在的idx。

import collections
class Solution(object):
    def removeDuplicateLetters(self, s):
        """
        :type s: str
        :rtype: str
        """
        res = ''
        for _ in set(s):
            top, idx = s[0], 0
            counter = collections.Counter(s)
            # 找到top
            for j in range(len(s)):
                if s[j] < top:
                    top, idx = s[j], j
                if counter[s[j]] == 1:
                    break
                counter[s[j]] -= 1
            res += top
            # 删除最小字符之前的子串
            s = s[idx+1:].replace(top, '')
        return res

栈维持着递增的顺序,栈底到栈顶的顺序则为从低到高。如果遇到当前字符比栈顶小并且栈顶元素在后面还存在(不只一个),则弹栈,让这个较小字符加入到栈中。

class Solution(object):
    def removeDuplicateLetters(self, s):
        """
        :type s: str
        :rtype: str
        """
        counter = collections.Counter(s)
        stack = list()  # 保持递增顺序
        for c in s:
            counter[c] -= 1
            if c in stack:
                continue
            while stack and stack[-1] > c and counter[stack[-1]]:
                stack.pop()
            stack.append(c)
        return ''.join(stack)
posted @ 2017-09-07 15:10  banananana  阅读(130)  评论(0)    收藏  举报