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 移除重复字母