描述
给出两个字符串,找到最长公共子串,并返回其长度。
样例
给出A=“ABCD”,B=“CBCE”,返回 2
挑战
O(n x m) time and memory.
解决思路
是典型的动态规划问题。一开始和字符串匹配搞混了。
csize[i][j]表示以A[i], B[j] 结尾的最长序列(不论是在什么地方开头的)。
csize[i][j] = csize[i-1][j-1] + 1 当且仅当 A[i] = B[j]
csize[i][j] = 0 , 当且仅当 A[i] != B[j]
class Solution {
public:
/**
* @param A: A string
* @param B: A string
* @return: the length of the longest common substring.
*/
int longestCommonSubstring(string &A, string &B) {
// write your code here
int posA = 0;
int posB = 0;
int max=0;
if(A.size() == 0 || B.size() == 0)
{
return 0;
}
int** csize = new int*[A.size()+1];
for(int i=0; i<=A.size(); i++)
{
csize[i] = new int[B.size()+1];
}
for(; posB < B.size(); ++posB)
{
if(A[0] == B[posB])
{
csize[0][posB] = 1;
max = 1;
}
else
{
csize[0][posB] = 0;
}
}
for(; posA < A.size(); ++posA)
{
if(A[posA] == B[0])
{
csize[posA][0] = 1;
max = 1;
}
else
{
csize[posA][0] = 0;
}
}
for(posA = 1; posA < A.size(); ++posA )
{
for(posB = 1; posB < B.size(); ++posB)
{
if(A[posA] == B[posB])
{
csize[posA][posB] = csize[posA-1][posB-1]+1;
if(csize[posA][posB] > max)
{
max = csize[posA][posB];
}
}
else
{
csize[posA][posB] = 0;
}
}
}
return max;
}
};