最長の回文構造をサブストリングタイトルleetcode

件名の説明:

文字列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)

おすすめ

転載: www.cnblogs.com/ysw-go/p/11420535.html