1.定義
所定の配列の配列が得られた配列は省略複数の要素の配列です。例えば、シーケンスZ = {B、C、D、B}は配列配列のX = {A、B、C、B、D、A、B}は、対応するインデックスは、シーケンス{2,3,5インクリメントされます、7}。
Zは、XとYの配列の共通のサブシーケンスであるときに、2つの配列XとYが与えられると、ZときXとYの両方の他のサブシーケンスです。
例えば、X = {A、B、C、B、D、A、B}、Yは= {B、D、C、A、B、A}、配列ならば{B、C、A}はXとYであります共通サブシーケンスは、それがXとYの最長共通部分列ではありません シーケンス{B、C、B、A}が共通部分列X及びYであり、その長さは4であり、そしてそれはXとYの最長共通サブシーケンスであり、X及びYは、4つ以上のような一般的な下位長さ部分ではありませんシーケンス。
2.ソリューション
ダイナミックプログラミングは効果的にこの問題を解決することができます。実際、最長共通部分列問題の最適なサブ構造の特定の性質。
3.自然
2つの配列の最長共通部分列は、2つの配列の最長共通部分列の接頭辞が含まれています。最長共通部分列問題に最適なサブ構造の性質は、あなたが動的なプログラミングアルゴリズムを使用することができるように解決するために。
実際には、X = {X1、X2、...、XM}とY = {Y1、Y2、Y3、... YN}設定シーケンスは、最長共通部分列Z = {Z1、Z2、Z3、です。 ...、ZK}
その後、我々は出て来ることができます
(1)の場合XM = YN、次いでZK = XM = YN、およびZK-1最長共通サブXM-1及びYn-1があります。
(2)XM場合!= Ynの、およびZK!= Xmを、次いで、Zは、最長共通サブXM-1およびY.
(3)XM場合!= Ynの、およびZK!=乃至Yn、ZはX及びYn-1は、最長共通サブシーケンスです。
4.最高値を計算
動的プログラミングアルゴリズムは、入力として配列X = {X1、X2、X3、...、XN}とY = {Y1、Y2、Y3、... YN}の最長共通部分列の長さを算出します。二つの出力配列CとB。A ここで、c [i] [j]は、YJ B [i]は[J]の副溶液が得られた問題の数で記録されているの値を最長共通部分列XIの長さに記憶されているアルゴリズムの最もそれらの記録とCの最適値[M] [N]。
スニペット:
public static int lcsLength(char[] x,char[] y,int [][]b){ int m = x.length-1; int n = y.length-1; int[][]c = new int[m+1][n+1]; for(int i =1;i<=m;i++)c[i][0] = 0; for(int i =1;i<=n;i++)c[0][i] = 0; for(int i = 11;i<=m;i++) for(int j = 1;j<=n;j++){ if(x[i] == y[j]){ c[i][j] = c[i-1][j-1]+1; b[i][j] = 1; } else if(c[i-1][j]>=c[i][j-1]){ c[i][j] = c[i-1][j]; b[i][j] = 2; } else{ c[i][j] = c[i][j-1]; b[i][j] = 3; } } return c[m][n]; }