Python 中不同字符的最小子序列


假设我们有一个文本,我们需要找到包含文本中所有不同字符且按字典序最小的子序列。因此,如果输入类似于“cdadabcc”,则输出将为“adbc”。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个栈 st,两个映射 last_o 和 considered,它们最初为空
  • 对于范围从文本长度 - 1 到 0 的 i
    • 如果 text[i] 不存在于 last_o 中:
      • last_o[text[i]] := i
      • considered[text[i]] := false
    • i := 0
    • 当 i < 文本长度时
      • 如果栈为空
        • 将 text[i] 推入栈
        • considered[text[i]] := true
        • 将 i 增加 1
      • 否则栈顶 > text[i] 且 considered[text[i]] 为假
        • 如果 last_o[栈顶] > i
          • considered[栈顶元素] := false
          • 从栈中弹出
        • 否则
          • considered[tex[i]] = true
          • 将 text[i] 插入栈
          • 将 i 增加 1
      • 否则当栈顶元素 < temp[i] 且 considered[text[i]] = false 时
        • 将 text[i] 插入栈
        • considered[text[i]] := true
        • 将 i 增加 1
      • 否则将 i 增加 1
  • 以反向顺序返回栈中所有元素作为字符串

让我们看看下面的实现以更好地理解:

示例

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"

更新于: 2020年3月5日

142 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告