该题解使用了单调栈的思路。具体来说,遍历字符串 s 中的每个字符,如果当前字符已经在栈中,则直接跳过;否则,将栈顶元素与当前字符比较,如果栈顶元素大于当前字符且栈顶元素在后面还会出现,则弹出栈顶元素,直到栈为空或栈顶元素小于等于当前字符。然后将当前字符压入栈中。最后将栈中元素拼接成字符串作为结果返回。这样可以保证结果字符串的字典序最小。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
stack = []
instack = defaultdict(int) # 记录字符是否在栈中
cnt = defaultdict(int) # 记录字符的剩余出现次数
# 统计每个字符的出现次数
for c in s:
cnt[c] += 1
for c in s:
cnt[c] -= 1 # 更新字符的剩余出现次数
if instack[c]: # 如果字符已经在栈中,跳过
continue
# 如果栈顶元素大于当前字符且在后面还会出现,弹出栈顶元素
while stack and stack[-1] > c and cnt[stack[-1]]:
p = stack.pop()
instack[p] -= 1
stack.append(c) # 将当前字符压入栈中
instack[c] += 1
return ''.join(stack) # 将栈中元素拼接成字符串作为结果返回