动态规划

1、求出最长公共子串的长度

最长公共子串的递推公式
alt alt

		// 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);
        }