[問題]文字列sを考えると、最も長いサブストリングパリンドロームを見つけることです。あなたは1000秒の最大の長さと仮定することができます。
例1 : 入力:" Babad " 出力:" BAB " 注:" ABAは" 有効な回答です。 例2 : 入力:" cbbd " 出力:" BB "
次のように二日前、私たちは私たちが書かれた質問の先頭に動的なプログラミングアプローチを使用し、今日、この質問を解決するために、「センターの拡張法」を説明し、我々は再帰式を探すために必要な[考えること]です。
我々は、F [i]は[J]のように表現されるであろうiをjからサブパリンドローム配列の文字列、jが<= iが、この場合は左下三角行列DPです!
[I] == A [jの場合 ] およびF [I-1] [J + 1]が真=、 その後F [i]は[J]も同様です。
なお、次の場合IJ <2、Sであれば、[I] =のS [j]を、次に[I] [j]をfは真、すなわち、単一の文字またはパリンドロームの二つの同一のサブストリングの隣接する文字のであろう。
クラス解決{ パブリック: ストリング longestPalindrome(文字列S){ int型 SLEN = s.length()。 もし(SLEN == 0)リターン "" ; 文字列 RES = "" ; ベクター <ベクトル< BOOL >> F(SLEN、ベクトル< BOOL >(SLEN、偽))。 int型 MAXLEN = 0 ; int型 curLenで指定= 0 ; 以下のための(int型 I = 0;私はSLEN <; 私は++ ){ ための(int型 J = 0 ; J <= iがあり、j ++){ // [0] [0]真= F、一定成立 する場合((S [I] == S [J])&&((IJ < 2)||(I> 0 && F [I- 1 ] [J + 1 ]))){ F [I] [J]は、 = 真。 curLenで指定 = I - J + 1 ; もし(curLenで指定> MAXLEN){ MAXLEN = curLenで指定。 RESの = s.substr(J、curLenで指定)。 } } } } 戻りRES。 } }。