テンキー5回文構造最長部分文字列
Manacherアルゴリズムは、この問題を解決するために設計されています
説明:
1、温度:新しい文字列#のすべての文字の前に挿入されたが、最も注目最も頭と尾はまた、挿入されているので、奇数位置にあるすべてのオリジナルキャラクター
2、maxcenter:最大中心位置を既知のパリンドローム配列
3、maxend:最大の回文文字列に覆われた尾のインデックス番号
私はその後、決定され、彼は内部に含まれるパリンドローム配列であれば、文字列の対応する部分は、パリンドロームを持っている場合は文字の前に近いものを、彼は、対応する、それぞれのです4、これは、パリンドロームの一部であり、彼の
図5は、ミラーの半分を超えて、不確実でない場合には、限定するもので、下限が分( - 同じ、ミラー半径点境界)です。
leetcode注(文字列スタックオーバーフロー)のいくつかの場所:
1、#挿入すると新しい文字列、使用の一back回避のスタックオーバーフロー(他の可能な干渉をするがある場合は近くの空のように、デフォルトの割り当ては十分ではありません)
判断が戻って一時は2、
最後に戻りSUBSTR、s.substr(開始、LEN)で返さ、第2の長さが取られている3、
クラスのソリューション{ パブリック: 文字列 longestPalindrome(文字列S){ 場合(S == "" )のリターン "" ; 文字列の TEMP = " #" 。 以下のために(int型私は= 0 ; I <s.lengthを(); I ++ ) { // 一時[2 * I + 1] = S [i]は、 // 一時[2 * I + 2] = '#'; temp.push_back(S [I])。 temp.push_back(' #' ); } INTの REC [ 3000 ]。 memset(REC、0、はsizeof (REC))。 int型 maxend = 0、maxcenter = 0 ; 以下のために(INT iが= 0 ; I < 2 * s.length()+ 1 ; I ++ ) { もし(maxend> ⅰ) { REC [I] =分(REC [ 2 * maxcenter-i]は、maxend- I)。 } 一方、(I-REC [I]> 0 && I + REC [I] < 2 * s.length()+ 1 - 1 && TEMP [i]は[I-REC - 1 ] == TEMP [I + REC [I ] + 1 ]) REC [I] ++ ; もし(REC [I]> REC [maxcenter]) { maxend = I + REC [I]。 maxcenter = I; } } INT lenは、開始; もし(TEMP [maxcenter] == ' #' ) { もし(TEMP [maxend] == ' #' ) { 開始 = maxcenter-maxend / 2 。 よう = maxend- maxcenter。 } 他 { 開始 = maxcenter-(maxend + 1)/ 2 。 よう = maxend-maxcenter + 1 。 } } 他 { もし(TEMP [maxend] == ' #' ) { 開始 = maxcenter-maxend / 2 。=(maxend-maxcenter)/ 2 * 2 + 1 。 } 他 { 開始 = maxcenter-(maxend + 1)/ 2 。 よう = maxend- maxcenter。 } } リターンs.substr(開始、LEN); } }。
追加は、それがその後、析出し、最終的にグラムに戻り、文字列gの正面にある場合、これはオーバーフロー、ない意味がない、それを試してみました。。それはより多くのメモリを占有します。(文字が、文字は確かにオーストリア.pushbackを推奨されていませんが、確かにオーバーフロー直接割り当てをしようとしませんでした)
クラスのソリューション{ パブリック: 文字列 longestPalindrome(文字列S){ 場合(S == "" )のリターン "" ; 文字列の TEMP = " #" 。 以下のために(int型私は= 0 ; I <s.lengthを(); I ++ ) { temp.push_back(S [I])。 temp.push_back(' #' ); } INTの REC [ 3000 ]。 memset(REC、0、はsizeof (REC))。 int型 maxend = 0、maxcenter = 0 ; 以下のために(INT iが= 0 ; I < 2 * s.length()+ 1 ; I ++ ) { もし(maxend> ⅰ) { REC [I] =分(REC [ 2 * maxcenter-i]は、maxend- I)。 } 一方、(I-REC [I]> 0 && I + REC [I] < 2 * s.length()+ 1 - 1 && TEMP [i]は[I-REC - 1 ] == TEMP [I + REC [I ] + 1 ]) REC [I] ++ ; もし(REC [I]> REC [maxcenter]) { maxend = I + REC [I]。 maxcenter = I; } } INT lenは、開始; 文字列グラム。 もし(TEMP [maxcenter] == ' #' ) { もし(TEMP [maxend] == ' #' ) G = s.substr(maxcenter-maxend / 2、maxend- maxcenter)。 他 G = s.substr(maxcenter-(maxend + 1)/ 2、maxend-maxcenter + 1 )。 } 他 { もし(TEMP [maxend] == ' #' ) G = s.substr(maxcenter-maxend / 2、(maxend-maxcenter)/ 2 * 2 + 1 )。 他 G = s.substr(maxcenter-(maxend + 1)/ 2、maxend- maxcenter)。 } リターングラム。 } }。