这是一个动态规划问题
当其中一个串长度为0的时候子序列为0
当两个串尾字符相等时,最长子序列等于子串的最长子序列长度+1
当尾字符不等时,等于两个串的子串最大的最长子序列长度
上面是长度计算,计算具体子串的时候可以基于上面得到的矩阵来计算
public static String LCS_caculate(String s1,String s2){
int size1=s1.length();
int size2=s2.length();
int chess[][]=new int[s1.length()+1][s2.length()+1];
for(int i=1;i<=size1;i++){//根据上面提到的公式计算矩阵
for(int j=1;j<=size2;j++){
if (s1.charAt(i-1)==s2.charAt(j-1)) {
chess[i][j]=chess[i-1][j-1]+1;
}else {
chess[i][j]=max(chess[i][j-1],chess[i-1][j]);
}
}
}
int i=size1;
int j=size2;
StringBuffer sb=new StringBuffer();
while((i!=0)&&(j!=0)){//利用上面得到的矩阵计算子序列,从最右下角往左上走
if (s1.charAt(i-1)==s2.charAt(j-1)) {
sb.append(s1.charAt(i-1));//相同时即为相同的子串
i--;
j--;
}else {
if (chess[i][j-1]>chess[i-1][j]) {
j--;
}else {
i--;
}
}
}
System.out.println((double)sb.length()/s2.length()+","+(double)sb.length()/s1.length());
return sb.reverse().toString();//记得反转
}