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