最长公共子序列(LCS)定义:
一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。比如数列A = “abcdef”, B = “adefcb”. 那么两个数列的公共子序列是"adef".
最长公共子序列和最长公共子字符串是有区别的,公共子序列里的元素可以不相邻,但是公共子字符串必须是连接在一起的。比如A和B的公共子字符串是“def”。
求解最长公共子序列要用到动态规划的概念。我们用c[i][j]记录X[i]与Y[j] 的LCS 的长度,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。此时我们根据X[i] = Y[j]还是X[i] != Y[j],就可以计算出c[i][j]。问题的递归式写成:
c[i,j]=0 if i=0,j=0
c[i,j]=c[i-1,j-1]+1 if i,j>0 and xi=yj
c[i,j]=Max{c[i,j-1],c[i-1,j]} if i,j>0 and xi不等于yj
程序的代码:
import java.util.Scanner;
public class LCS {
public static String[][] getlength(char[] x, char[] y)
{
int a[][] = new int[x.length+1][y.length+1];
//存在第一行和第一列全为0
String b[][] = new String[x.length][y.length];
for(int i=0; i<=y.length; i++)
{
a[0][i]=0;
}
for(int i=0; i<=x.length; i++)
{
a[i][0]=0;
}
for(int i=0; i
= a[i+1][j])
{
a[i+1][j+1] = a[i][j+1];
b[i][j] = "up";
}
else
{
a[i+1][j+1] = a[i+1][j];
b[i][j]= "left";
}
}
}
System.out.println("输出子过程的最长公共子序列的长度矩阵:");
for(int i =0; i
输出情况的截图: