Python中不同字符的最小子序列
假设我们有一个文本,我们必须找到该文本在字典上最小的子序列,该子序列仅包含一次所有文本的不同字符。因此,如果输入类似于“cdadabcc”,那么输出将为“adbc”。
为了解决这个问题,我们将遵循以下步骤-
定义一个堆栈st,两个映射last_o并考虑,它们最初是空白的
对于我在文本范围内的长度–1降至0
如果堆栈没有元素
否则,栈顶>text[i]并认为[text[i]]为假
否则,当堆栈顶部元素<temp[i]并认为[text[i]]=false时
否则我加1
将text[i]推入堆栈
考虑[text[i]]:=true
使我增加1
认为[tex[i]]=true
将text[i]插入堆栈
使我增加1
考虑[堆栈顶部元素]:=假
从堆栈弹出
如果last_o[stacktop]>i
除此以外
将text[i]插入堆栈
考虑[text[i]]:=true
使我增加1
last_o[text[i]]:=i
考虑[text[i]]:=假
如果在last_o中没有text[i]-
i:=0
而我<文字长度
以相反的顺序将堆栈的所有元素作为字符串返回
让我们看下面的实现以更好地理解-
示例
class Solution(object): def smallestSubsequence(self, text): """ :type text: str :rtype: str """ stack = [] last_o = {} considered = {} for i in range(len(text)-1,-1,-1): if text[i] not in last_o: last_o[text[i]] = i considered[text[i]] = False print(last_o) i = 0 while i < len(text): print(stack,i,text[i]) if len(stack) == 0: stack.append(text[i]) considered[text[i]] = True i+=1 elif stack[-1]>text[i] and considered[text[i]] == False: if last_o[stack[-1]]>i: considered[stack[-1]]=False stack.pop() else: considered[text[i]] = True stack.append(text[i]) i+=1 elif stack[-1]<text[i] and considered[text[i]] == False: stack.append(text[i]) considered[text[i]] = True i+=1 else: i+=1 return "".join(i for i in stack)
输入值
"cdadabcc"
输出结果
"adbc"