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 [stack top]> 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"