Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの個別の文字の最小のサブシーケンス


テキストがあるとすると、テキストのすべての異なる文字を1回だけ含む、辞書式順序で最小のテキストのサブシーケンスを見つける必要があります。したがって、入力が「cdadabcc」のような場合、出力は「adbc」になります。

これを解決するには、次の手順に従います-

  • スタックst、2つのマップlast_oを定義し、考慮します。最初は空白です
  • テキストの範囲の長さのiの場合–1から0まで
    • text[i]がlast_oに存在しない場合-
      • last_o [text [i]]:=i
      • 考察[text[i]]:=false
    • i:=0
    • whilei<テキストの長さ
      • スタックに要素がない場合
        • text[i]をスタックにプッシュ
        • 考察[text[i]]:=true
        • iを1増やします
      • それ以外の場合、スタックトップ>text[i]および考慮される[text[i]]はfalse
        • if last_o [stack top]> i
          • 考慮[スタックトップ要素]:=false
          • スタックからポップ
        • それ以外の場合
          • considered [tex [i]] =true
          • テキスト[i]をスタックに挿入
          • iを1増やします
      • それ以外の場合、スタックトップ要素
      • テキスト[i]をスタックに挿入
      • 考察[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"

    1. Pythonのヒストグラムで最大の長方形

      ヒストグラムの高さを表す整数配列が1つあるとします。各バーには単位幅があります。次のように最大面積の長方形を見つける必要があります- これを解決するには、次の手順に従います- スタックを作成し、i:=0、ans:=0を設定します <高さのサイズなら スタックの要素が0であるか、スタックの最上位要素の高さが<=height [i]の場合、 iをスタックに挿入し、iを1増やします それ以外の場合- x:=スタックの最上位要素、スタックから削除します。 height:=heights [x] temp:=height *(i * stac

    2. Pythonで雨水をトラップする

      n個の非負の整数の配列があるとします。これらは、各バーの幅が1である標高マップを表しており、雨が降った後にトラップできる水量を計算する必要があります。したがって、マップは次のようになります- ここでは、6つの青いボックスがあることがわかります。したがって、出力は6になります。 これを解決するには、次の手順に従います- スタックst、water:=0およびi:=0を定義します 私は<身長のサイズ =height [i]の場合、iをスタックにプッシュし、iを1増やします それ以外の場合 x:=スタックトップ要素、スタックからトップを削除 スタックが空で