Manacher's Algorithm
2484 ワード
目次
1.パリンドロム
わが国の言葉で言えば回文です.
「雁」のように前後同じ単語
2.DPを使用したフィンランドROMの検索
指定された文字列で可能な返信を検索します.指定された単語が返信であるかどうかを確認するのではなく、指定された文字列で可能な返信を検索します.
前回のレッスンで説明したダイナミックプランニング(Dynamic Programming,DP)を使用してクエリーを検索する方法を説明します.
文字列はarrの名前で格納されます.
指定された文字列のサイズがnの場合、n*nサイズのブール配列が用意されます.
DP[a][b]=a~bをチェックする場合、回文であればtrueまたはfalse
最終的には上記の形状が現れます.
基本的なタスクは次のとおりです.
文字列のサイズが1の場合、文字列はエコーです.
そのため、次の手順に従います.
for (int i = 1; i <= n; i++){
DP[i][i] = true;
}
次に、i番とi+1番の文字をDPに比較して保存し、「aa」や「bb」などの文字列を確認します.for (int i = 1; i <= n - 1; i++){
if (arr[i] == arr[i + 1]) DP[i][i + 1] = true;
}
長さ1,2の返事が見つかりました.3つ以上の長さを持つ文字列を文に戻すには、次の条件を満たす必要があります.
for (int l = 2; l <= n - 1; l++){
for (int i = 1; i <= n - k; i++){
int j = i + k;
if (arr[i] == arr[j] && DP[i + 1][j - 1]) DP[i][j] = true;
}
}
「Bananac」を例にとりましょうnは7になり、DPは7*7になる.
2つの長さの返信が見つかった場合は、次の表に進みます.
3より長いコメントを検索すると、表は次の操作を行います.
この方法で返事を見つけることができます.
3. Manacher's Algorithm
これはパリンドロンで有名なアルゴリズムです.
このアルゴリズムを行うために,まず配列Aを作成する.
A[i]は、iを中心とした回文半径の大きさである.
(このアルゴリズムはiを0から開始します.A[0])を使用します.
ここでは、「bananc」を例に説明する.
int値R、Pを準備します.初期値は-1です.
1.iは0からn-1までです.
2.すべてのj3.i<=Rによれば、A[i]の初期値を得ることができる.
3-1. i>Rの場合、A[i]は0である.
3-2. i<=Rは、iがp中心のパリン症候群に属することを意味する.このときiの対称点i′を求める.(i'=2*P-i)このときA[i]=min(R-i,A[i'])となる.
4.A[i]の初期値からarr[i+A[i]とarr[i]]が等しくなるまでA[i-A[i]を増加させる.以降iを追加します.
このプロセスでは、次の表を使用できます.
4.両アルゴリズムの違い
最初のアルゴリズムでは,時間複雑度はO(N^2)であった.
この場合,Nの値が大きいほど効率が低下する.
N=10000万も1億を超える
2番目のアルゴリズムでは,時間複雑度はO(N)であった.
最初のアルゴリズムと明らかな違いがあるため,多くの人が返信文を検索する際にmanacher'sアルゴリズムを使用する.
Reference
この問題について(Manacher's Algorithm), 我々は、より多くの情報をここで見つけました https://velog.io/@jjj7061/Manachers-Algorithmテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol