Pythonで最長のチャンク回文分解の長さを見つけるプログラム
テキストがあるとします。次のようなa[1]、a [2]、...、a[k]が存在するような最大のkを見つける必要があります。各a[i]は空白ではない文字列です。そして、それらの連結a [1] + a [2] + ... + a [k]は、指定されたテキストと同じです。 1からkの範囲のすべてのiについて、a [i] =a [{k+1--i}]。
したがって、入力がtext ="antaprezatepzapreanta"の場合、 "a | nt | a | pre | za | tpe | za | pre | a | nt | a"のように分割できるため、出力は11になります。
これを解決するには、次の手順に従います-
-
カウンター:=0
-
i:=1、j:=テキストのサイズ-1
-
ic:=0、jc:=テキストのサイズ
-
i <=j、do
-
テキストのサブストリング[インデックスicからi-1へ]がテキストのサブストリング[インデックスjからjc-1へ]と同じである場合、
-
カウンター:=カウンター+ 2
-
ic:=i
-
jc:=j
-
-
i:=i + 1
-
j:=j-1
-
-
icがjcと同じでない場合は、
-
カウンター:=カウンター+ 1
-
-
リターンカウンター
例
理解を深めるために、次の実装を見てみましょう
def solve(text): counter = 0 i, j = 1, len(text) - 1 ic, jc = 0, len(text) while i <= j: if text[ic:i] == text[j:jc]: counter += 2 ic = i jc = j i += 1 j -= 1 if ic != jc: counter += 1 return counter text = "antaprezatepzapreanta" print(solve(text))
入力
[3,4,5,2,1,7,3,4,7], 3
出力
11
-
Pythonで連続して増加する最長の部分文字列の長さを見つけるプログラム
小文字の文字列sがあるとします。これには、英語の文字と「?」が含まれますシンボル。 「?」ごとに削除するか、小文字に置き換える必要があります。文字「a」で始まる、連続して増加する最長の部分文字列の長さを見つける必要があります。 したがって、入力がs =vta ??? defkeの場合、出力は6になります。これは、sを vtabcdefkeに変換でき、 abcdefは、連続して増加する最長の部分文字列であり、これも次のように始まります。 「a」。 これを解決するには、次の手順に従います- maxlen:=0 長さ:=0 qmarks:=0 sの各cについて、 cが「?」と同じ
-
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]