这是一个动态规划问题
当其中一个串长度为0的时候子序列为0
当两个串尾字符相等时,最长子序列等于子串的最长子序列长度+1
当尾字符不等时,等于两个串的子串最大的最长子序列长度
![](https://img-blog.csdn.net/20160717002604151?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
上面是长度计算,计算具体子串的时候可以基于上面得到的矩阵来计算
- 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();
- }