1. 程式人生 > 實用技巧 >leetcode_316. 去除重複字母

leetcode_316. 去除重複字母

給你一個字串 s ,請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小(要求不能打亂其他字元的相對位置)。

注意:該題與 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同



示例 1:

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

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


提示:

1 <= s.length <= 104
s 由小寫英文字母組成

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/remove-duplicate-letters
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        stack=[]
        temp_set=set()#字元是否已經存在
        dic={}
        for i in range(len(s)):
            dic[s[i]]=i#字元最後出現位置

        for i, x in enumerate(s):
            if not stack :#如果stack為空
                stack.append(x)
                temp_set.add(x)
            if x in temp_set:#如果已經在集合中
                continue
            while(stack and stack[-1]>x and i<dic[stack[-1]]):
                #如果stack非空,棧頂大於x 且後面還有棧頂元素
                t=stack.pop()
                temp_set.remove(t)
            else:
                stack.append(x)
                temp_set.add(x)
        return ''.join(stack)