文字列を考えると、あなたは出力最長の対称部分文字列の長さになっています。例えば、与えられた Is PAT&TAP symmetric?
、最長の対称部分文字列がある s PAT&TAP s
ので、あなたが出力する必要があり、 11
。
入力仕様:
各入力ファイルには、1000年を超えない長さの非空の文字列を与える一つのテストケースが含まれています。
出力仕様:
各テストケースのために、単に行の最大長を印刷します。
サンプル入力:
Is PAT&TAP symmetric?
サンプル出力:
11
1の#include <iostreamの> 2の#include < ストリング > 3の#include <アルゴリズム> 4 5 使用 名前空間STDを、 6 文字列strの、T1、T2。 7 INT RES = 1 。 8 // 最普通的遍历 9 ボイドWAY1() 10 { 11 のために(int型 i = 0 ; iはstr.lengthを()<; ++ I) 12 { 13 のために(INT J = str.length() - 1 ; J> I; -J) 14 { 15 t1.assign(str.begin()+ I、str.begin()+ + J 1。); 16 t2.assign(t1.rbegin()、t1.rend()); 17 IF(T1 == T2) 18は、 RES = RES> t1.length()?RES:t1.length(); 19 } 20 } 21れる } 22は 23である 。// 同じ回文ストリングの中心の両側使用 24 空隙ウェイ2を() 25 { 26である ため(int型 I = 0 ;私は(str.sizeを<); ++ I)は{ 27 INTJ; 28 用(J = 1 ; I - J> = 0 && I +はJ <str.size()&& STRは== STR [I - J] [Iは、J +]; J ++); // 現在の最長文字パリンドロームパリンドロームストリングの中心を見つける 29の RES = MAX(RES、2 * J - 1); // パリンドロームストリングの最大長更新 30を するため(J = 0 ; I - Jは> = 0 && Iは、Jを+ + 1。 <str.size()&& STR [I - J] == STR [Iが+ 1 + J]; J ++); // 現在の文字が最も長いパリンドロームパリンドロームストリングの左中央の文字である見つけるために 31 最大=のRES(RES、2 * J); //はパリンドロームストリングの最大長更新 32 } 33 } 34 35 // 使用动态规划 36 空隙ウェイ3() 37 { 38 のint DP [ 1010 ] [ 1010 ]。 39 のために(int型 I = 0 ; I <str.length(); iが++ ) 40 { 41 DP [i]は[I] = 1 。 42 であれば(私はstr.length()< - 1つの && STR [I] == STR [I + 1 ]) 43 { 44 DP [i]は[I + 1 ] = 1 。 45 のRES =2 ; 46 } 47 } 48 のための(int型 L = 3、L <= str.length(); L ++ ){ 49 のための(int型 iは= 0 ; iがL + - 1 <str.length(); iは++を){ 50 のint J = iがL + - 1 。 51 であれば(STR [I] == STR [J] && DP [I + 1 ] [j - 1 ] == 1 ){ 52 、DP [I] [J] = 1 。 53の RES = L。 54 } 55 } 56 } 57 } 58 59 のint main()の 60 { 61 のgetline(CIN、STR)。 62 WAY1(); 63 coutの<< RES << てendl; 64 リターン 0 ; 65 }