暴力について列挙エンドポイントが/ *場合は、指数関数的な複雑で、その結果、最長回文構造部分文字列を評価しました。最適化の点、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つのブログを参照してください。