件名の説明:
文字列sを考えると、最も長いサブストリングパリンドロームを見つけることです。あなたは1000秒の最大の長さと仮定することができます。
例1:
入力:「babad」
出力:「BAB」
注:「ABA」は有効な答えがあります。
例2:
入力: "cbbd"
出力: "BB"
解決策1:アドオン、開花センター
私たちは、特定のパリンドローム配列が対称であることを知っているので、展開について、それが文字程度に等しいかどうかを判断するために、我々は、各サイクルの中心を選択することができます。
文字列と偶数奇数の文字列が存在しているので、我々は文字の延長または拡張の間から2つの文字から開始する必要があり、そうするので、N + N-1拠点の合計。
{ソリューションクラス のパブリック静的な文字列longestPalindrome(文字列S){ IF(S == NULL || s.length()== 0){ リターン""; } //パリンドローム配列の記録開始位置 INTスタート= 0; / /パリンドローム配列の終了位置記録 INT端を= 0; パリンドローム配列の//レコード長は中間得 INT MAXLEN = 0; のための(INT I = 0;私は<s.lengthを();私は++){ //からN + N-1中心点普及し始め INT LEN1 getTheLengthOfPalindrome =(S、I、I); INT LEN2 getTheLengthOfPalindrome =(S、Iは、I + 1); MAXLEN = Math.max(LEN1、LEN2); IF (MAXLEN>(終了-開始])){ スタート= I - (MAXLEN - 1)/ 2。 終了= IはMAXLEN / 2 +。 } } //注意をここに:SUBSTRINGの2つのパラメータを:回文配列のインデックス-1の最後に文字、終了を開始回文配列を開始 リターンs.substring;(スタート、エンド+ 1。) } プライベート静的INT getTheLengthOfPalindrome {(S列は、左INT、右INT) ;左のint L = INT右= R&LT; 一方、(L> = 0 && R&LT <s.length()&& s.charAt(L)== S .charAt(R&LT)){ L - ; R&LT ++; } //)R-1(パリンドローム拡張文字列の長さエンド- (L + 1)+1が、 それは1-L-Rであり、&LT R&LTを返す- 1 - 。 L; } }
複雑性分析:
〜時間の複雑さ:O(N²)
〜空間的複雑:O(1)