和第402题一样,由于要返回结果的字典序最小,就是要保证有重复的部分是单调递增的
def removeDuplicateLetters(self, s):
"""
:type s: str
:rtype: str
"""
stack = []
count = Counter(s)
vis = set()
for i in s:
if i not in vis: #空间换时间,因为是删除重复的,所以栈里有的就不用考虑了
while stack and i < stack[-1] and count[stack[-1]] > 0: #这里count大于0的原因是说明后面还会有这个单词,所以可以出栈
vis.remove(stack.pop())
stack.append(i)
vis.add(i)
count[i] -= 1
return "".join(stack)