关于最长公共子序列问题的分析,这篇博客讲的比较好
http://blog.csdn.net/yysdsyl/article/details/4226630
下面给出我写的java代码:
import java.util.Arrays;
import java.util.Scanner;
public class LCS {
static StringBuffer str=new StringBuffer();
static void ff(char []a,char []b){
int [][]c=new int[a.length+1][b.length+1];
int [][]k=new int[a.length][b.length];
for(int i=1;i<=a.length;i++){
for(int j=1;j<=b.length;j++){
if(a[i-1]==b[j-1]){
c[i][j]=c[i-1][j-1]+1;
k[i-1][j-1]=0;
}
else{
if(c[i-1][j]>=c[i][j-1]){
c[i][j]=c[i-1][j];
k[i-1][j-1]=1;
}
else{
c[i][j]=c[i][j-1];
k[i-1][j-1]=-1;
}
}
}
}
System.out.println("最长公共长度:"+c[a.length][b.length]);
lsc(k,a,b);
str.reverse();
System.out.println("最长公共子序列:"+str);
}
static void lsc(int [][]k,char []a,char []b){
int num1=a.length;
int num2=b.length;
if(num1>=1&&num2>=1){
if(k[num1-1][num2-1]==0){
str.append(a[num1-1]);
a=Arrays.copyOf(a, a.length-1);
b=Arrays.copyOf(b, b.length-1);
lsc(k,a,b);
}
else if(k[num1-1][num2-1]==1){
a=Arrays.copyOf(a, a.length-1);
lsc(k,a,b);
}
else if(k[num1-1][num2-1]==-1){
b=Arrays.copyOf(b, b.length-1);
lsc(k,a,b);
}
}
else{
return ;
}
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("请输入字符串a:");
String str1=input.nextLine();
System.out.print("请输入字符串b:");
String str2=input.nextLine();
char []ch1=str1.toCharArray();
char []ch2=str2.toCharArray();
ff(ch1,ch2);
}
}