4.最長の回文配列----ダイナミックプログラミング

問題解決のアイデア:

状態
F [i]の[j]はSをサブストリングは、文字のj番目の文字に、i番目を表し、回文配列の最長の長さがあります。

伝達方程式
次いで、i番目の文字s及びj番目の同じ文字であれば、
[I] [J] = F + 2 - F [I + 1] [1 J]
の場合、S i番目の文字とj番目の文字異なりますその後、
F [i]は[J] = MAX(F [I + 1] [J]、F [i]は[J - 1])
とトラバーサル順序に注意してください、私は前方の横断を開始するための最後の文字から、私からJ + 1あなたは、各サブ質問が良いとされていることを確認することができるように、背中を横断し始めました。

初期
最長パリンドローム配列F [i]は[I] = 1は、 単一の文字であります

結果
[0]、F [N - 1 ]
クラスソリューション{
     公共 のint longestPalindromeSubseq(文字列S){
         int型 N = s.length()。
        INT [] [] F = 新しい INT [N] [N]。
        INT I = N - 1; I> = 0; i-- ){ 
            F [i]は[I] = 1 int型 J = I + 1、J <nであり、j ++ ){
                 場合(s.charAt(I)== s.charAt(J)){ 
                    F [I] [J] = F [I + 1] [J - 1] + 2 
                } {
                    F [I] [J]= Math.max(F [I + 1] [J]、F [i]は[J - 1 ])。
                } 
            } 
        } 
        戻り F [0] [N - 1 ]。
    } 
}

 

 
クラスソリューション{
     公共 のint longestPalindromeSubseq(文字列S){
         / * 
            BB AA BB 
            BB BB A 
            DP [i] [j]は、j番目の文字との間のパリンドローム配列の最長の長さにi番目の文字を表す
            の場合は[1 I] ==ときにS [j]は、中間列iおよびjのパリティの数を考慮すると、DP [I] [J] = DP [I + 1] [J-1] + 2 
            DP上記[I] [J ] = DP [説明I + 1] [J-1 ] 2 + である:
            配列がAA B bのとき、iは、0 = J = 3、 次にDP [0] [3] = DP [1] [2] = 4 + 2 
            配列がBABで、I = 0、J = 2、 DP [0] [2] = DP [1] [1] + 2 = 3 
            配列がBBである場合、iは、0 = J = 1、DP [0] [1] = DP [1] [0] = 0 + 2 = 2(DP [1] [0]のデフォルト値は0である)
            アカウントにパリティ取る式の
            2、Sであれば、[I ]!= S [j]を、次にDP [I] [J] = Math.max(DP [I + 1] [j]は、DP [I]、[J-1])
            [I] [j]は方程式DP上述:
            !:配列がdcbcc(0-4インデックス)である場合に S [0] = S [4]、 DP [0] [4] = Math.max( DP [0] [3]、 DP [1,4])= Math.max(2,3)= 3 

            注:私はJの前方に配置されている上記の分析に従って使用、及びIとしてここ習慣を書き込みます私は、Jの後ろに配置されている、すなわちDP上記[I] [J]本明細書DP [j]は[i]がなければならない
            二つのループのために、I 0からがlen-1を横断するため、およびjはI-あります1が0にデクリメントされ、
            iが5 =場合、jはDPが得られ、次いで、43210の順であるあらかじめと前進する準備ができて等価[0] [5]工程、DP [1]〜[5]値
            パリンドローム配列として単一の文字、すなわちDP [I] [I] = 1。
        * / 

        int型 LEN = s.length();
         INT [] [] DP = 新しい新しい INT [LEN] [LEN]; 
       
        のためのINT 0 = I; I <LEN; I ++ ){ 
            DP [I] [I] = 1 ;
            以下のための INTjは私を= - 1; J> = 0; j-- ){
                 場合(s.charAt(I)== s.charAt(J)){ 
                    DP [j]は[I] = DP [J + 1] [I-1] + 2 
                } { 
                    DP [J] [I] = Math.max(DP [J + 1] [i]は、DP [j]は[I-1 ])。
                } 
            } 
        } 
        戻り DP [0] [lenの-1 ]。
    } 
}

 

おすすめ

転載: www.cnblogs.com/manmanchanglu/p/12577257.html