まず最初に、単語と目的のサイズを読み取る必要があります。
次に、この単語の文字が順番に使用されて作成された最長の回文を見つける必要があります。
たとえば、サイズ= 7、単語= "abcababac"の場合、答えは7( "abababa")です。
追記:単語のサイズが3000未満です。
まず最初に、単語と目的のサイズを読み取る必要があります。
次に、この単語の文字が順番に使用されて作成された最長の回文を見つける必要があります。
たとえば、サイズ= 7、単語= "abcababac"の場合、答えは7( "abababa")です。
追記:単語のサイズが3000未満です。
回答:
Manacherのアルゴリズムにちなんで名付けられたアルゴリズムがあります。これは非常に高速な線形時間アルゴリズムです。
追記:Zアルゴリズムに精通している場合は、Zアルゴリズムが似ていることがわかります。
編集する
OPの意味を誤解しました(ただし、処理中の情報を削除したくありません。多少便利です)。彼は文字列の最も長い回文のサブシーケンスを意味するので、動的プログラミングは良いようです:
私が考えることができる最速のアルゴリズムは、クリエイティブな方法でLCSを適用することです。この問題は、O(N ^ 2)時間とO(N ^ 2)空間で解決できます。ここで、Nは文字列のサイズです。
LCS(S、reverse(S))は、最大の回文サブシーケンスが文字列Sとその逆の間の最大の共通サブシーケンスになるため、最大の回文サブシーケンスを提供します。
たとえば、
S = "abcababac"
T = "cababacba"(Sの逆)
LCS(S、T)= "abababa"
文字列のLPSを見つける問題は、2つの文字列の最長共通サブシーケンスを見つけることに変換できます。この場合、1つの文字列が元の文字列になり、2番目の文字列は元の文字列の逆になります。
Longest Common Subsequenceの問題は、パターンマッチングの問題と似ていますが、テキスト内の文字をスキップできる点が異なります。また、目標は、できるだけ長い1つの一致のみを返すことです。
LCSは 再帰とメモ化を使用します。
MasekとPatersonによって発見された、時間の複雑さのやや速いアルゴリズムが存在します。 。紙のリンク:マセックとパターソン
2つの文字列のLCSを計算するためにHirschbergによって提示された他の2つのアルゴリズム (サイズ )および (サイズ )。これらの文字列に表示される可能性がある記号は、サイズのアルファベットから来るという仮定に基づいています(実際には、ほとんどの場合に当てはまります)。したがって、シンボルは以下を使用してメモリに保存できます。メモリの1ワードに収まるビット。2つのシンボルを比較できます時間。文字列の異なる数 は もちろん、どちらよりも少ない そして 。
これは必要です どこで LCSの長さです。これは、LCSの長さが短いことが予想される場合に使用されます。ダイナミックプログラミングを使用してこの問題を解決すると、マトリックスのほとんどのエントリが同じになるため、スパースダイナミックプログラミングのアイデアを使用できます。
このアルゴリズムには、 時間。これは、LCSの長さが近い場合に非常に効率的です。、その場合、それは 。
詳細な手順とアルゴリズムは、ヒルシュベルクの論文で説明されています。
別の優れたアルゴリズムがSohel Rahmanによって提案されており、 時間、場所 文字列が一致する、順序付けられた位置のペアの総数です。該当しない場合 の順序です 、しかし多くの場合、 の順序です 。これはRMQ(範囲最大クエリ)の概念を使用しています。紙のリンク:ラーマン