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

Pythonでの2つの有効な括弧文字列の最大ネスト深度


文字列があり、その文字列が「(」および「)」文字のみで構成され、これらのプロパティを満たしている場合にのみ、有効な括弧文字列(VPSで示される)であるとします-

  • 空の文字列、または

  • ABと書くことができます。ここで、AとBはVPS、または

  • (A)と書くことができます。ここで、AはVPSです。

以下のように、任意のVPS Sのネスト深度の深さ(S)を定義することもできます-

  • 深さ( "")=0

  • 深さ(A + B)=深さ(A)、深さ(B)の最大値。ここで、AとBはVPSです

  • 深さ( "(" + A + ")")=1 +深さ(A)、ここでAはVPSです。

VPSシーケンスがある場合、AとBがVPSになるように(そしてAの長さ+Bの長さ=シーケンスの長さ)、2つの互いに素なサブシーケンスAとBに分割する必要があります。ここで、max(depth(A)、depth(B))が可能な最小値になるようなAおよびBを選択した場合。次に、AとBのそのような選択をエンコードする(seqの長さの)回答配列を見つける必要があります。seq[i]がAの一部である場合はanswer [i] =0、それ以外の場合はanswer [i]=1です。

したがって、入力が「()(())()」の場合、出力は[1,1,1,0,1,0,1,1]

になります。

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

  • n:=seqの長さ、res:=0の長さがnである0の配列

  • c1、c2:=0、0

  • 0からn–1の範囲のiの場合

    • seq [i] =‘(’

      • c1

    • それ以外の場合

      • c1> c2の場合、c1を1減らし、そうでない場合はc2を1減らし、res [i]:=1

  • 解像度を返す

理解を深めるために、次の実装を見てみましょう-

class Solution(object):
   def maxDepthAfterSplit(self, seq):
      n = len(seq)
      res = [0] *n
      c1,c2= 0,0
      for i in range(n):
         if seq[i] == '(':
            if c1<c2:
               c1+=1
         else:
            c2+=1
            res[i]=1
      else:
         if c1>c2:
            c1-=1
         else:
            c2-=1
            res[i]=1
   return res
ob = Solution()
print(ob.maxDepthAfterSplit("()(())()"))

入力

"()(())()"

出力

[1, 1, 1, 0, 1, 0, 1, 1]

  1. Pythonでの二分木の最大深度

    二分木が1つあるとします。その木の最大の深さを見つけなければなりません。ツリーの最大深度は、最長のパスを使用してルートからリーフに到達するためにトラバースされるノードの最大数です。ツリーが次のようになっているとします。ここでは深さが3になります。 これを解決するために、次の手順に従います。 ここでは、再帰的アプローチを使用します。メソッドはsolve(root、depth =0)です。 ルートが空の場合は、深さを返します それ以外の場合は、solve(left、depth + 1)とsolve(left、depth + 1)の最大値を返します 理解を深めるために、次の実装を見てみ

  2. 2つの文字列から珍しい単語を見つけるPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 − 2つの文字列が与えられているので、与えられた文字列から珍しい単語を取得する必要があります。 次に、以下の実装のソリューションを見てみましょう- 例 # uncommon words def find(A, B):    # count    count = {}    # insert in A    for word in A.split():       count[word] = coun