动态规划,构造一个二维矩阵,相同的节点定为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); } };