您的位置:首页 > 其它

最长公共子串

2016-05-10 01:46 337 查看
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。
例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。

void LCS(char *p, char *q)
{
if (p == NULL || q == NULL)
{
return 0;
}

int len1 = strlen(p);
int len2 = strlen(q);

if (len1 < 1 || len2 < 1)
{
return 0;
}

int buf[len1+1][len2+1];
memset(buf, 0, sizeof(buf));

for (int i = 1; i < len1+1; i++)
{
for (int j = 1; j < len2+1; j++)
{
if (p[i-1] == q[j-1])
{
buf[i][j] = buf[i-1][j-1] + 1;
}
else if (buf[i-1][j] > buf[i][j-1])
{
buf[i][j] = buf[i-1][j];
}
else
{
buf[i][j] = buf[i][j-1];
}
}
}

int i = len1;
int j = len2;
stack<char> temp;
while (i > 0 && j > 0)
{
if (p[i-1] == q[j-1])
{
temp.push(p[i-1]);
i--;
j--;
}
else if (buf[i-1][j] > buf[i][j-1])
{
i--;
}
else
{
j--;
}
}

while (!temp.empty())
{
cout << temp.top() << " ";
temp.pop();
}
cout << endl;

return buf[len1][len2];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: