//子串必须是连续的,dp[i][j]表示以str1中下标i,str2中下标j结尾的最长公共子串长度。保存长度和下标,即可求出最长子串
//而求最长公共子序列的时候,不一定连续,dp[i][j]表示str1中前i个字符与str2中前j个字符的最长公共子序列长度。
//如何得到最长公共子序列 可从后往前推 可能有多个最长公共子序列
dp[i][j]表示字符串s1的前i个字符和s2的前j个字符的最长公共子序列的长度
dp[i][j] = Math.max(dp[i-1][j-1]+1(if arr[i]==arr[j]),dp[i-1][j],dp[i][j-1])
可另外设置一个数组int[][] flag dp[i][j]=dp[i-1][j-1]+1的时候 此时flag[i][j]=1; 当dp[i][j]=dp[i-1][j] 此时flag[i][j]=2; 当dp[i][j]=dp[i][j-1] flag[i][j]=3;
通过dp的值为1 2 3倒推 即可得到具体的最长公共子序列
public static String LCS (String str1, String str2) {
if(str1==null || str2==null) return "-1";
// write code here
int len1=str1.length();
int len2=str2.length();
int[][] dp=new int[len1][len2];
int res = -1;
int end=0;
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
dp[i][j]=-1;
if(str1.charAt(i)==str2.charAt(j)){
if(i==0 || j==0) dp[i][j]=1;
else if(dp[i-1][j-1]!=-1)
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=1;
}
if(dp[i][j]>res){
res=dp[i][j];
//System.out.println(j);
end=i;
}
}
}
//在没有公共子串的时候
if(res==-1) return "-1";
//System.out.println(res);
return str1.substring(end-res+1,end+1);
}
京公网安备 11010502036488号