给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入: "bcabc"
输出: "abc"
示例 2:
输入: "cbacdcbc"
输出: "acdb"
关键思想:逐个找字典最小的字母
思路一:递归
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
# 先按字典排序
for a in sorted(set(s)):
tmp = s[s.index(a):]
# 看余下的是否能组成所需的字母
if len(set(tmp)) == len(set(s)):
return a + self.removeDuplicateLetters(tmp.replace(a, ""))
return ""
思路二:迭代
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
res = ""
while s:
# 从右往左找,找到最小位置的索引号
loc = min(map(s.rindex, s))
# 找该索引前面最小的字母
a = min(s[:loc + 1])
res += a
s = s[s.index(a):].replace(a, "")
return res
思路三:栈
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
from collections import Counter
c = Counter(s)
stack = []
existed = set()
for a in s:
# print(stack)
if a not in existed:
# 判断后面还有没有该字母
while stack and stack[-1] > a and c[stack[-1]] > 0:
existed.remove(stack.pop())
stack.append(a)
existed.add(a)
c[a] -= 1
return "".join(stack)
思路四:贪心算法
class Solution:
def removeDuplicateLetters(self, s):
for c in sorted(set(s)):
suffix = s[s.index(c):]
if set(suffix) == set(s):
return c + self.removeDuplicateLetters(suffix.replace(c, ''))
return ''