最長の回文構造部分文字列 - 動的計画

文字列sを考えると、最も長い部分文字列パリンドロームを見つけることだ。あなたは1000秒の最大の長さをとることができます。

例1

入力:Babad 
出力:BAB 
注:ABAは、有効な答えがあります。

例2

入力:" cbbd " 
出力:" BB "

 

解決策1:暴力ソリューション

パリンドロームストリング定義は、それらが回文であるかどうかを決定するために、2よりも大きい長さのサブストリングに等しいすべてを列挙する。特定の実装では「取得した現在最も長いパリンドロームの長さのサブストリング」のみサブよりも大きいためパリンドローム部分文字列にすること。ここでは、我々はすべてを列挙し、暴力的なソリューションを使用していますが、制限時間を超えたが、それでもこの方法を掲載させていただきます

財団のインポート// インポートしたい、SUBSTRING方法なしそれ以外の文字列 
FUNC longestPalindrome(_ S:文字列) - > 文字列{
    ガードs.count > 0   { リターン "" }
     もし s.count == 1 { リターンS}
    MaxLenだっます。int = 1
    
    ましょう範囲 = NSRange(所在地:0、長さ:1 
    せ結果 =(S よう.substring NSStringの)(と:範囲)
    VAR resultStr =結果として文字列
    
     I  0 .. <s.count - 1 {
          J における I + 1 .. < s.count {
             なら J - I + 1 > MAXLEN && 有効な(S、left1:I、RIGHT1:J){
                MAXLEN = J - I + 1 
                LET範囲 = NSRange(所在地:I、長さ:MAXLEN)
                せ結果 =(S よう.substring NSStringの)(と:範囲)
                resultStr = 結果
            }
        }
    }
    リターンresultStr
}
// 分析パリンドローム 
FUNC有効(_ S:文字列、LEFT1:INT、RIGHT1:INT) - > ブール{
    聞かせてstrArr = 配列(複数可)
    varが残ってます。int = left1
    VAR右:のInt = RIGHT1
     ながら左< 右{
         もし!strArr [左] = strArr [右] {
             リターン 
        } +左= 1 
        、右 = - 1
    }
    返す 
}

そして、leetCodeを提出するが、より多くの制限よりも、結果は以下の通り:

 

 

対処方法2:動的計画

ソリューションの時間の複雑さはleetCodeないACに、高すぎる。以下の改善方法

次のようにまず、P(i、j)を定義します 

P(i、j)は=(P(I + 1、J - 1)&& S [I] == S [J])

我々は状況がP(i、j)のが唯一のP(I + 1、J - 1)を知っている必要があり、パリンドロームの文字列を決定するための関数を呼び出す必要はありません知っていれば、ケースとなり、これは時間の複雑さになります我々はP(i、j)が格納されてから出て来ているしようとしている、時間のためのスペースを使用して、動的なプログラミングアプローチを取るので、O(n)を減らします。

もしSがパリンドローム配列であるS [I] == S [j]はSを決定することができるように、[I + 1、jは-1]限り[I、J]はパリンドローム配列です。

長さを求めるとき上側P(i、j)の2式の長さは、2つのケースが考慮するように、クロスボーダー見出さもたらすこととして、使用することができません。

したがって、まず、式P(i、j)は上記セットを使用して、パリンドローム配列1の長さであり、文字のそれぞれ外側に拡張、3の長さは、5の両側に、すべての長さが出て求めて初期化します。

同様に、4の全ての偶数長さを得られた式を使用して、パリンドローム配列2の長さを初期化し、6は全て探し出しなります。

コードは以下の通りであります:

クラスソリューション{
     パブリック文字列longestPalindrome(文字列S){
     int型の長さ= s.length()。
    もし(長さ== 1){ リターンS;}
     ブール [] [] P = 新しい ブール[長さ]、[長さ]。
    int型 MAXLEN = 0 ;
    ストリングmaxPal = "" ;
     のためのINT I = 1; I <=長さI ++)// ループのすべての長さを通る
    ためのINT J = 0; J <長さ、J ++ ){
         int型。K = I + J - 1 IF(K> =長さ)// インデックスが範囲外であった、サイクルの終わり
        BREAK 
        P [J] [K] =(I == I == 2 1 || || P [+ J. 1] [K - 1。])&& s.charAt(J)== s.charAt(K); / / で個々判定1及び2の長さ
        IF(P [J] [K] && K> MAXLEN){
            maxPal = s.substring(J、K + 1 )。
        }
    }
    返すmaxPalを。
}
}

上記は、動的プログラミングアプローチで、更新していきます、私はみんなの注目を願っています!

 

 

 

おすすめ

転載: www.cnblogs.com/guohai-stronger/p/11800983.html
おすすめ