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

Pythonを使用して最長のパリンドロームサブシーケンスの長さを見つけるプログラム


文字列が与えられたとします。長さが均一で、中央を除いて2つの連続する同じ文字を含まないパリンドロームサブシーケンスを見つける必要があります。このタイプの部分文字列の長さを出力として返す必要があります。

したがって、入力がs ='efeffe'のような場合、出力は4

になります。

偶数の長さのパリンドロームサブシーケンスが1つしかないため、出力は4です。文字列は長さ4の「effe」です。

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

  • n:=sのサイズ

  • dp:=1つのnx n 2d配列。ここで、各項目は(0、空白の文字列)の形式のペアです

  • n-1から-1の範囲のiの場合、1ずつ減少します

    • i + 1からnの範囲のjについては、次のようにします

      • s[i]がs[j]と同じで、dp [i + 1、j-1]の文字列がs [i]でない場合、

        • dp [i、j]:=ペアを作成します(dp [i + 1、j-1] + 2、s [i]の最初の要素)

      • それ以外の場合

        • dp [i、j]:=ペアの最初の要素が最大になる(dp [i + 1、j]、dp [i、j-1]、dp [i + 1、j-1])の中から選択します

      • dp [0、n-1]

        に格納されているペアの最初の要素を返します

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

def solve(s):
   n = len(s)
   dp = [[(0, '')]*n for _ in range(n)]
   for i in range(n-1, -1, -1):
      for j in range(i+1, n):
         if s[i]== s[j] and dp[i+1][j-1][1] != s[i]:
            dp[i][j] = (dp[i+1][j-1][0] + 2, s[i])
         else:
            dp[i][j] = max(dp[i+1][j], dp[i][j-1], dp[i+1][j-1], key=lambda x: x[0])
   return dp[0][n-1][0]
print(solve('efeffe'))

入力

'efeffe'

出力

4

  1. Pythonのn-aryツリーで最長のパスの長さを見つけるプログラム

    各アイテムが保持しているエッジリスト(u、v)があり、uがvの親であることを表しているとします。ツリー内で最も長いパスの長さを見つける必要があります。パスの長さは、1+そのパス内のノードの数です。 したがって、入力が次のような場合 パスが[1、4、5、7]であり、合計4つのノードがあるため、出力は5になります。したがって、パスの長さは1 + 4=5です。 これを解決するには、次の手順に従います- g:=指定されたエッジリストからのグラフの隣接リスト d:=新しい地図 関数bfs()を定義します。これには時間がかかります d [o]:=1 f:=o q:=[o]

  2. Pythonを使用してバイナリツリーの右側のノードを見つけるプログラム

    バイナリツリーが提供されているとします。また、ノード(「u」という名前)へのポインターが与えられ、提供されたノードのすぐ右にあるノードを見つける必要があります。特定のノードの右側にあるノードは同じレベルにとどまる必要があり、特定のノードはリーフノードまたは内部ノードのいずれかになります。 したがって、入力が次のような場合 u =6の場合、出力は8になります。 ノード6の右側にあるノードはノード8であるため、値8が返されます。 これを解決するには、次の手順に従います- ルートが空の場合、 nullを返す dq:=新しい両端キュー dqの最後にルートを挿入