キーコード:
以下のために(INT I = 1; I <= x.length; iは++){
ための(int型J = 1; J <= y.lengthあり、j ++){
IF(X [I-1] == Y [J-1] ){
C [I] [J] = Cの[I-1] [J-1] +1。
B [i] [j]は= 1。
}他{
IF(C [I-1]〜[J]> = C [I] [J-1]){
C [I] [J] = C [I-1]〜[J]。
B [i] [j]は2 =。
}他{
C [I] [J] = C [I] [J-1]。
B [i] [j]は= 3。
}
}
}
}
上記、I = 0又はJ = 0、すなわち、XまたはYは、空のシーケンス、C [I] [J] = 0です。
完全なコード:
{クラスZCGGZXL公開 / ** *最長共通部分列 * *質問: *与えられた二つの配列X = {X1、X2、... 、XN} とY = {Y1、Y2、... ,, YN }、XおよびYの最長共通サブシーケンスを見つけます。 * *テスト入力: * ABCBDAB * BDCABA *テスト出力: * 4 * BCBA * / パブリック静的な無効メイン(文字列引数[]){ CHAR [] X = { 'A'、 'B'、 'C'、「B '' D '' A '' B '}; [] Y = {char型' B '' D '' C '' A '' B '' A「を}; INT [] [ 。。] B =新しい新しいINT [x.length用+ 1] [y.length用+ 1]; INT [] [] = lcsLength C(X、Y、B) のSystem.out.println(C [x.length] [Y 。長さ])。 LCS(x.length、y.length、X、B)。 } / ** *入力:X配列、Y配列 *出力:B配列は、配列cを返します。 * C [I]、[J]に格納されたXi及びYjとの最長共通サブシーケンスの長さ 値* B [i] [j]が、Cを記録で得られたサブ問題の解である[I] [J]最長共通部分列を構築するときに使用します。 @return * * / パブリック静的INT [] [] lcsLength {(CHAR [] X、[] YをCHAR、[] [] B INT) //が配列Cの初期化 のint [] [] = C新しい新しいINT [x.lengthを+1] [y.length + 1]; // 0は空のシーケンスを保持 するための(INT I = 0;私はc.lengthを<; Iは++){ ため(INT J = 0; J <C [0] .LENGTH; J ++ ){ C [I] [J] = 0; } } 計画を開始// (INT I = 1; I <= x.length; Iは++){ (INT 1 = J; J <= y.length; J ++ ){ IF(X [I-1] == Y [J-1]){ Cは、[I]は[J]は= C [1-I]、[J-1]を+1しました; B [I] [J] = 1; }他{ IF(Cする[1-I] [J]> = C [ I]、[J-1])。{ C [I] [J] = C [I-1]〜[J]; B [I] [J] = 2; }そうでなければ{ C [I] [J] = C [ I]、[J-1]; B [I] [J] = 3; } } } } 戻りC; } パブリック静的ボイドLCSは、(Iは、J int型int型、charは[] X、B [] [] INT){ //終了条件 IF(I == 0 || J == 0)のリターン; // Bの分析[I] [j]は異なるブランチに IF(B [I] [J ] == 1){ LCS(I-1、J-1、X、B)。 System.out.print(X [I-1])の。 }他{ (B [I] [J] == 2)もしLCS(I-1、J、X、B)。 他のLCS(I、J-1、X、B)。 } } }