文字のシーケンスが回文の連結であることを確認する線形時間アルゴリズムはありますか?私の頭に浮かぶのは、単純な解決策だけです。
1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat
注:長さ1の文字列が回文であると定義されている場合、答えは自明です。これはそうではないと仮定しましょう。
文字のシーケンスが回文の連結であることを確認する線形時間アルゴリズムはありますか?私の頭に浮かぶのは、単純な解決策だけです。
1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat
注:長さ1の文字列が回文であると定義されている場合、答えは自明です。これはそうではないと仮定しましょう。
回答:
ばらばらのパリンドロームが必要だとすると、これはPALSTAR問題と呼ばれ、Zvi GalilとJoel Seiferasによる線形時間アルゴリズムがあります。「Palstar」の線形時間オンライン認識アルゴリズム。
アルゴリズムの説明は、テキストアルゴリズム (リンク先のページと前のページを参照)の本にあります。
2次時間アルゴリズムで問題がなければ、単純な動的プログラミングが機能するようです。
文字列を指定すると、をパリンドロームに分解できるかどうかを示す配列を維持します。
また、が回文かどうかを示す2Dテーブルも保持しています。これは、中心を選択して2つのポインターを外側に移動し、その中心の回文をチェックすることにより、時間で構築できます。考えられる中心ごとにこれを行います。中心は、それぞれ時間を要します。
これで、が分解できるかどうかを確認できますごとにが分解できるかどうかを確認し、はパリンドロームです(上記の2Dテーブルを使用)。これにより、時間および空間アルゴリズムが生成されます。
Manacherのオンラインアルゴリズムを使用してが回文であるかどうかを計算する場合、スペースの使用量は下げることができます(がから進むにつれて) 、基本的に2Dテーブルを削除します。s [ i + 1 、… j + 1 ] i j − 1 1
オーバーラップが許可されている場合、線形時間(入力文字列のサイズ)で実行できます。
最大パリンドロームの概念を定義しましょう:
半径kの最大のパリンドロームストリングSのサブストリングS」というものです
たとえば、の場合S = banana
、S' = anana
は半径2の最大回文です。
最大のパリンドロームは、いくつかのkの半径kの最大パリンドロームです。
例えば、場合S = banana
、"ana"
、"anana"
、そのすべての最大の回文です。
ここで、文字列のすべての最大パリンドロームを見つけることができれば、文字列全体がパリンドロームの連結であるかどうかを確認するのは簡単です。
取るS = abbaccazayaz
。その最大の回文は次のとおりです。
したがって、「abba」は[1..4]を超え、「acca」は[4..7]を超え、「zayaz」は[8..12]を超えます。この3つのパリンドロームの連結(オーバーラップは許可されますか?)はストリング全体に及ぶため、 "abbaccazayaz"はパリンドロームの連結になります。
これで、文字列Sのすべての最大パリンドロームを線形時間で見つけることができることがわかりました!*
アイデアは、一定時間の最も低い共通の祖先クエリを備えたSのサフィックスツリーを使用することです。
したがって、長さmの文字列SがO(n)時間の回文の連結であるかどうかを確認できます。
*
Gusfield、Dan(1997)、「9.2すべての最大パリンドロームを線形時間で見つける」、文字列、ツリー、シーケンスのアルゴリズム
Palindrome [] []が配列で、Palindrome(i、j)がiからjまでの部分文字列が回文であるかどうかをチェックし、回文である場合に1を返すか、回文でない場合に無限大を返し、最小の数を探す関数であるとします。パーティションの場合、ボトムアップで作成します。
セルを埋める必要があり、各セルは最大で使用するため、アルゴリズムは。少し変更(前処理)すると、に改善できます。また、このパーティションを見つけることは難しくありません。O (n )O (n 3)O (n 2)
abbaaccaabba.