动态规划,构造一个二维矩阵,相同的节点定为1,对角线为1最长的就是最长公共子串的长度。构造二维矩阵时想直接new[m][n]发现编译不过,这里先new出m个int*类型的指针,再为每个指针new出n个int类型的空间。参考了最长公共子串(动态规划)

class Solution {
public:
    /**
     * longest common substring
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @return string字符串
     */
    string LCS(string str1, string str2) {
        // write code here
        int m = str1.length();
        int n = str2.length();

        int max_len = 0;
        int index = 0;

        //申请m+1个指针,再向每个指针分配n+1个维度的int构成dp[m+1][n+1]矩阵;
        int* (*dp) = new int*[m+1];
        for(int i=0;i<m+1;i++)
        {
            dp[i] = new int[n+1];
            for(int j=0;j<n;j++)
            {
                dp[i][j] = 0;
            }
        }

        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(str1[i-1] != str2[j-1])
                {
                    dp[i][j] = 0;
                }
                else
                {
                    dp[i][j] = dp[i-1][j-1] + 1;
                    if(dp[i][j] > max_len)
                    {
                        max_len = dp[i][j];
                        index = i-1;
                    }
                }
            }
        }
       return str1.substr(index-max_len+1, max_len);
    }
};