316. 去除重复字母(单调栈)

 

难度中等

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

 

示例 1:

输入:s = "bcabc"
输出"abc"

示例 2:

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

 

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        left = Counter(s)  # 统计每个字母的出现次数
        ans = []
        in_ans = set()
        for c in s:
            left[c] -= 1
            if c in in_ans:  # ans 中不能有重复字母
                continue
            # (设 x=ans[-1]) 如果 c < x,且右边还有 x,那么可以把 x 去掉,
            # 因为后面可以重新把 x 加到 ans 中
            while ans and c < ans[-1] and left[ans[-1]]:
                in_ans.remove(ans.pop())  # 标记 x 不在 ans 中
            ans.append(c)  # 把 c 加到 ans 的末尾
            in_ans.add(c)  # 标记 c 在 ans 中
        return ''.join(ans)

 

 

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        s_map = {}
        for i in s:
            if i in s_map:
                s_map[i]+=1
            else:
                s_map[i] =1

        stk = []
        for ch in s:
            if ch not in stk:
                while stk and s_map[stk[-1]]>0 and ch < stk[-1]:
                    stk.pop()
                stk.append(ch)
            s_map[ch]-=1
        return "".join(stk)

 

posted @ 2022-04-28 23:03  乐乐章  阅读(27)  评论(0编辑  收藏  举报