LeetCode #316: Remove Duplicate Letters

来源:互联网 发布:深圳淘宝电商培训 编辑:程序博客网 时间:2024/05/17 06:47

Problem Statement

(Source) Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example:
Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "acdb"

Analysis

Tags: [Stack, Greedy]

Solution

class Solution(object):    def removeDuplicateLetters(self, s):        """        :type s: str        :rtype: str        """        from collections import deque, Counter        sta = deque()        cnt = Counter(s)        se = set()        n = len(s)        if n > 0:            sta.append(s[0])            se.add(s[0])            cnt[s[0]] -= 1        for i in xrange(1, n):            ch = s[i]            if ch not in se:                if ch > sta[-1]:                    sta.append(ch)                    se.add(ch)                elif ch <= sta[-1]:                    while sta and sta[-1] >= ch and cnt[sta[-1]] > 0:                        x = sta.pop()                        se.remove(x)                    sta.append(ch)                    se.add(ch)            cnt[ch] -= 1        return ''.join(list(sta))

Complexity analysis
- Time complexity: O(n), where n is the length of input string.
- Space complexity: O(n), where n is the length of input string.

0 0