[leetcode] 316. Remove Duplicate Letters

该博客介绍了一种使用栈解决LeetCode题目——删除字符串中的重复字母,同时保持字母顺序的方法。通过建立last字典记录字符最后出现的位置,并在遍历字符串时比较栈顶元素与当前字符,确保结果是最小字典序。代码中,当栈内字符大于当前字符且栈内字符未到达其在原字符串中的最后位置时,会将栈顶元素弹出。最终将栈内元素拼接成结果字符串。
摘要由CSDN通过智能技术生成

Description

Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Note: This question is the same as 1081: https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/

Example 1:

Input: s = "bcabc"
Output: "abc"

Example 2:

Input: s = "cbacdcbc"
Output: "acdb"

Constraints:

  • 1 <= s.length <= 104
  • s consists of lowercase English letters.

分析

题目的意思是:给定一个字符串,去除其中的非重复字符,而且结果要按字母顺序排,前提是不能打乱其原本的相对位置。

这道题我参考了一下leetcode 1081的做法,需要用栈来实现,用last字典保存每个字符最后一个位置。

  • 在遍历s的时候,如果遍历的字符小于栈里的字符的时候,这时还要看栈里的元素是否到了末尾位置,这时候就可以用last字典来判断,如果到达了,则不能出栈;如果没达到,则要出栈。
  • 对于栈stack里面出现过的字符,则直接跳过就行了。
  • 最后把栈里的元素拼接就行了。

代码

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        last=defaultdict(int)
        for i in range(len(s)):
            last[s[i]]=i
        stack=[]
        for i,ch in enumerate(s):
            if(ch in stack):
                continue
            while(stack and stack[-1]>ch and i<last[stack[-1]]):
                stack.pop()
            stack.append(ch)
        return ''.join(stack)

参考文献

[leetcode] 1081. Smallest Subsequence of Distinct Characters
[LeetCode] Remove Duplicate Letters 移除重复字母

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值