タイトル:出力パリンドローム最長の部分文字列は、元の1000年の最も長い文字列
ピット:日本語文S = "";
見直し馬車車のアルゴリズムを単に答えを書き込む前に、出力文字列ではありません、。
クラスソリューション{ パブリック文字列longestPalindrome(文字列S){ // レイド決意= S "" IF(s.length()== 0 ) 戻りS; チャーは [] = 新しい新しい チャー [20005 ;] INT [] = P 新しい新規の int型 [20005]; // 各半径の位置を記録 '!' [0] =; // 包括プラスインコヒーレント文字 int型。CNT = 1; // Aの添え字のカウント のために(int型 I = 0; I <s.length(); I ++ ){ A [CNT] = '#' ; CNT ++ 。 [CNT] = s.charAt(I); CNT ++ ; } A [CNT] = '#' ; CNT ++ ; A [CNT] = '@'; // 包括プラス無関係な文字 / * 前端部処理、アルゴリズムが開始 添字文字現在の反復を表し:iは 自己含む、パリンドロームIDX下付文字の半径を表す:P [IDX]の IDを本工程を横断する右端回文に拡張することができ中心点 のmx:現在の横断プロセスがのは最も遠いプローブの長さの呼びましょう、右端の位置インデックスに拡張することができます jは:idが私についての文字対称に中心に、idが左側にあるが、トラバースされており、 P [j]は、で決定された 長さのパリンドローム最長サブ:ANS T:元の文字列開始インデックスでパリンドローム最長サブ * / INT ANS = 2 ; INT T = 0 ; INT= 1 ID、MX = 1 ; INT。LEN s.length = 2 *()+ 3; // 補間#プラスエンドツーエンドの長さ のために(INT I = 1; Iは<LEN; I ++ ){ int型 J = 2 ID * - I; IF(MX> I){ IF(MX-I> = P [J]) P [I] = P [J]; // I ID及びjは対称であるが、IDの中心の列を含みますIまたはJの中心にパリンドロームサブストリング最も長い 他 P [I] = MX- I; } そう P [I] = 1 ; // 仮P [i]は、より大きな又は中心が存在してもよいです拡張 しながら(A [I + P [I]] == A [I- P [I])を P [I] ++ ; IF(I + P [I]> MX){ // 更新し、IDに対応する右端のポイント ID = I; MX = ID + P [I]; } IF(P [I]> ANS ){//回答更新 ANS = Pを[I]; T =(P-ID [ID])/ 2; // 元の文字列開始添字のレコードパリンドローム最長サブ } } ANS - ; // 除去効果#は、対称エッジとしてもたらさ 戻り s.substring(T、T + ANS); } }