动态规划
1、求出最长公共子串的长度
最长公共子串的递推公式
// dp[i][j] 表示 到s1的i ,s2的j时,目前的公共子序列长度
int[][] dp = new int[len1+1][len2+1];
int maxLen = 0,indexI=0,indexJ=0;//indexI,indexJ记录最大子串的结束位置
// 找出数组元素之间的关系式
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(c1[i-1] == c2[j-1]){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = 0;
}
if(dp[i][j] >= maxLen){
maxLen = dp[i][j];
indexI = i;
indexJ = j;
}
}
}
2、根据长度还原出公共子串
if(maxLen > 0){
char[] res = new char[maxLen];
int index = maxLen-1;
while(indexI>=0 && index>=0){
res[index--] = c1[indexI-1];
indexI--;
}
return new String(res);
}