以上为LCS的一个最优子结构定理,据此可以得到递归公式如下(c[i][j]表示当前匹配到的LCS的长度)
根据如下矩阵计算LCS
以下为java实现:
package bluebrige;
import java.util.Scanner;
public class Lcs {
static int [][]c=new int[8][7];
static int [][]b=new int[8][7];//保存路径,对于不同情况分别取-1,-2,-3三个状态值,以找到一个LCS
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str1,str2;
str1=sc.nextLine();
str2=sc.nextLine();
char []x=str1.toCharArray();
char []y=str2.toCharArray();
lcsLength(x,y);
printLcs(x,x.length,y.length);
System.out.println();
System.out.println(c[x.length][y.length]);
}
public static void lcsLength(char x[],char y[]) {
int m=x.length;
int n=y.length;
for(int i=1;i<=m;i++) {
c[0][i-1]=0;
}
for(int j=1;j<=n;j++) {
c[j][0]=0;
}
for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++) {
if(x[i-1]==y[j-1]) {
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;
}
}
}
}
}
public static void printLcs(char x[],int i,int j) {
if(i==0||j==0) {
return;
}
if(b[i][j]==-1) {
printLcs(x,i-1,j-1);
System.out.print(x[i-1]+" ");
}
else
if(b[i][j]==-2)
printLcs(x,i-1,j);
else
printLcs(x,i,j-1);
}
}