タイトル
タイトル説明
文字列を与えられた s
見つけるために、 s
最も長いサブストリングパリンドロームを。あなたは、と仮定することができる s
1000年の最大の長さ。
例
入力:「babad」
出力:「BAB」
注:「ABA」は有効な答えがあります。
分析
暴力:最初から直接最長の部分文字列を見つけるために、両側の次の反復を終了するには、中心を通って拡張することができます。
馬車車のアルゴリズム(Manacher):使用Manacherアルゴリズム、最長の回文の部分文字列を見つけるために、動的プログラミング
ダイヤグラム
建設。。。
コード
1つの ストリングlongestPalindrome(文字列s){ 2 INT LEN = s.length()。 3 列ミリアンペア= 「#」。 4 のためには、(I = 0をint型、iがLEN <; ++ I){ 5 ma.push_back(S [I])。 6 ma.push_back(' #' )。 7 } 8 INT MX = 0、ID = 0、new_len = lenの* + 1 2、pは= 0、[new_len];融点 図9は、 のために <;(new_len ++ I I = 0 int型{I) 10 、MP [I] = MX I>?分(MP [2 * ID-I]、MX-I):1 。 11 しながら、(I-MP [I]> = 0 && MA [I-MP [I]] == MA [iが+ MP [I]]){ 12 //チャーX = maは、Y [I [i]は、MPを+] = MA [I- MP [I]]。 13 ++ MP [I]。 14 } 15 であれば(私はMPを+ [I]> MX){ 16 MX = iは+ [i]の融点と、 17 ID = I。 18 } 19 であれば(MP [I]> MP [P])P = I。 20 } 21 LEN = MP [P] - 1 。 22 、P = P / 2 - LEN / 2 。 23 リターンs.substr(P、LEN)。 24 }