求str1和str2的最长公共子序列的长度。定义状态pf[i][j]表示分别以str1[i],str2[j]结尾的连续公共子串的长度。所以对于pf[i+1][j+1],有两种情况:
1. str1[i+1] != str2[j+1],则pf[i+1][j+1] = 0;
2. str1[i+1] = str2[j+1],则pf[i+1][j+1] = pf[i][j] + 1;
代码如下:
int maxCommStr(char* str1, char* str2)
{
int len1, len2, i, j, max = 0, end = 0;
len1 = strlen(str1);
len2 = strlen(str2);
int** pf = new int*[len1]; //根据字符串长度分配一个二维数组
for (i=0; i<len1; i++)
{
pf[i] = new int[len2];
}
for (i=0; i<len1; i++)
{
for (j=0; j<len2; j++)
{
pf[i][j] = 0; //数组初始化
}
}
for (i=0; i<len1; i++)
{
for (j=0; j<len2; j++)
{
if (i == 0 || j == 0) //处理以第一个字符结尾(长度为1)的情况
{
if (str1[i] == str2[j])
{
pf[i][j] = 1;
if (pf[i][j] > max)
{
max = pf[i][j];
end = i;
}
}
else
{
pf[i][j] = 0;
}
}
else
{
if (str1[i] == str2[j])
{
pf[i][j] = pf[i-1][j-1] + 1;
if (pf[i][j] > max)
{
max = pf[i][j];
end = i;
}
}
else
{
pf[i][j] = 0;
}
}
}
}
for (i=0; i<len1; i++) //清除内存
{
delete pf[i];
}
delete pf;
char* ret = new char[max+1];
memcpy(ret, str1+end-max+1, max);
ret[max] = '/0';
std::cout << ret << std::endl;
return max;
}
int main()
{
char* str1 = "blog.csdn.netc";
char* str2 = "blog.aaaa.netc";
std::cout << maxCommStr(str1, str2) << std::endl;
return 0;
}