给出两个字符串,找到最长公共子串,并返回其长度。
样例
给出A=“ABCD”,B=“CBCE”,返回 2
注意子串的字符应该连续的出现在原字符串中,这与子序列有所不同
思路:记 m = A.strlen(); n = B.strlen(); 这题如果使用蛮力法来求解的话,我们需要判断B中的字符是否在A中出现,并且需要使用标记来记录是否连续的出现,其算法复杂度为O(n*m^2);
另外的一种解法就是使用动态规划来求解.
最优子结构.
LCMSubStr(A, B, i, j) = LCMSubStr(A, B, i-1, j-1) + 1 if A[i-1][j-1] otherwise 0; (1<= i <= m, 1<= j <= n);
len = max(LCMSubStr(A,B,i,j), len);
code :
class Solution {
public:
/**
* @param A, B: Two string.
* @return: the length of the longest common substring.
*/
int longestCommonSubstring(string &A, string &B) {
// write your code here
const int m = A.size(), n = B.size();
int len = 0;
//定义一个二维数组用来存储计算结果
vector<vector<int>> LCMS(m+1, vector<int>(n+1, 0));
//采用自底向上的方法来求解动态规划
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if ( A[i-1] == B[j-1]) {
LCMS[i][j] = LCMS[i-1][j-1] + 1;
len = max(len, LCMS[i][j]);
} else
LCMS[i][j] = 0;
}
}
return len;
}
private:
inline int max(int a, int b)
{
return a > b ? a : b;
}
};
其算法复杂度为O(n*m);