Pythonで最長の素晴らしい部分文字列を見つけるプログラム
数値文字列sがあるとします。私たちが知っているように、素晴らしい部分文字列はsの空でない部分文字列であり、回文にするために任意の数のスワップを行うことができます。 sの最大長の素晴らしい部分文字列の長さを見つける必要があります。
したがって、入力がs ="4353526"のような場合、 "35352"が最長の素晴らしい部分文字列であるため、出力は5になります。 「35253」回文を作成できます。
これを解決するには、次の手順に従います-
-
n:=0
-
pos_map:=キー0を含み、対応する値がsのサイズであるマップ
-
max_len:=1
-
s-1から0の範囲サイズのiの場合、1ずつ減らします。
-
n:=n XOR(2 ^ s [i])
-
nがpos_mapに存在する場合、
-
max_len:=max_lenとpos_map[n] -i
の最大値
-
-
0から9の範囲のjの場合、実行
-
m:=n XOR 2 ^ j
-
mがpos_mapにある場合、
-
max_len:=max_lenとpos_map[m] -i
の最大値
-
-
-
nがpos_mapにない場合は、
-
pos_map [n]:=i
-
-
-
max_lenを返す
例
理解を深めるために、次の実装を見てみましょう
def solve(s): n = 0 pos_map = {0:len(s)} max_len = 1 for i in range(len(s)-1, -1, -1): n = n ^ (1 << int(s[i])) if n in pos_map: max_len = max(max_len, pos_map[n]-i) for j in range(10): m = n ^ (1 << j) if m in pos_map: max_len = max(max_len, pos_map[m]-i) if n not in pos_map: pos_map[n] = i return max_len s = "4353526" print(solve(s))
入力
"4353526"
出力
5
-
Pythonで最長のアナグラムサブシーケンスの長さを見つけるプログラム
2つの小文字の文字列SとTがあるとすると、最長のアナグラムサブシーケンスの長さを見つける必要があります。 したがって、入力がS =helloworld、T =hellorldの場合、出力は8になります これを解決するには、次の手順に従います- c:=新しいマップ、d:=新しいマップ 0からaのサイズの範囲のiの場合、実行 cのa[i]の場合、 c [a [i]]:=c [a [i]] + 1 それ以外の場合 c [a [i]]:=1 0からbのサイズの範囲のiの場合、実行 dのb[i]の場合、 d [b [i]]:=
-
Pythonで最長の回文部分文字列
文字列Sがあるとします。Sで最も長い回文部分文字列を見つける必要があります。文字列Sの長さは1000であると想定しています。したがって、文字列が「BABAC」の場合、その場合、最長の回文部分文字列は「BAB」です。 これを解決するために、次の手順に従います 文字列の長さと同じ次数の正方行列を1つ定義し、Falseで埋めます 主対角要素をtrueに設定して、0からorder –1までのすべてのiに対してDP[i、i] =True start:=0 範囲2からS+1の長さのlの場合 0からSの長さの範囲のiの場合– l + 1 end:=i + l l =2の場合、 S [i]