Manacherアルゴリズム - 最長の回文構造部分文字列

   暴力について列挙エンドポイントが/ *場合は、指数関数的な複雑で、その結果、最長回文構造部分文字列を評価しました。最適化の点、DP 2次元アレイ、複雑さはO(M * N)mまで低減することができる nは二つの文字列の長さです。本論文では、Manacherアルゴリズムは、より優れた二次元DPの時間やスペースよります。* / 


1
の#include <iostreamの> 2の#include < ストリング > 3。 の#define MAXSIZE 100 4。 使用した 名前空間STD; 5 INT レン[MAXSIZE]; 6 int型のmain(){ 7。 文字列事前; 8 CIN >> 事前; 9 文字ツール= " { " ; //は、クロスボーダーを防ぎます。 10 INT LEN =(INT )pre.length(); 11 のためにINTは iは= 0 ; I <LEN; I ++ ){ 12 ツール+ = " " 13 ツール+ = プレ[I]。 14 } 15 ツール+ = " " 16 ツール+ = " } "// 防止越界 17 INT MX = 0、ANS = 0、PO = 0 18 INT LEN2 =(INT )tool.length(); 19 のためにINT I = 1 ; I <LEN2; I ++ ){ 20は、 / * 選択下限 / * 21である IF(MX> I) 22である [I]が(MX-I、レン[=分レン2 *重量PO- I]); 23である 24 レン[I] = 1 ; 25 / * 上限分析 * / 26 / * 注いずれの場合にも、アルゴリズムは、その新たに算出されたパリンドローム配列の長さ以下描画するには、上限一定のみ可能であるよりも保証することができない 27 その下限は。アルゴリズムの主要部分は、下限の繰り返し決意を回避するために簡略化されます。特定のパリンドロームサブためのものであってもよい 28 長く不明であること、したがって、さらに決定されなければなりません。 * / 29 (ツールの[I-レン[I]] ==ツール[I +LEN [I]) 30 lenの[I] ++ ; 31である / *が 最右端パリンドローム配列を更新するかどうかが決定される、回答 * / 32 IF(LEN [I]は+ I> MX){ 33が lenの= MX [I ] + I; 34は、 PO = I; 35 } 36 ANS = MAX(ANS、レン[I]); 37 } 38が COUT ans- << 1。; 39 リターン 0 ; 40 }

Manacherアルゴリズムは、O(N)の複雑さは、パリンドロームストリングの最大長さを決定します。

具体的な原則と認証プロセスは、次の2つのブログを参照してください。

https://segmentfault.com/a/1190000003914228

https://www.cnblogs.com/z360/p/6375514.html

おすすめ

転載: www.cnblogs.com/popodynasty/p/12122229.html