您的位置:首页 > 其它

最大公共子串问题

2011-05-13 16:24 232 查看
最大公共子串问题

这个是动态规划的基础题目。动态规划就是递推和重复子结构。
确定了递推关系后。找到一个能极大地减少重复运算的子结构至关重要。选的好了,时间效率会很好。
这个问题,不妨设第一个串为a,长度为n,第二个串为b,长度m。那么最长的子序列长度为f(n,m)
当a
=a[m]时
f(n,m)=1+f(n-1,m-1)
否则f(n,m)=max(f(n-1),f(m-1))
同时建立一个存储计算过的f(x,y)的矩阵,如果计算过了就直接使用
程序如下所示

#include <iostream>
#define MAXLen 1000
char seq1[MAXLen];
char seq2[MAXLen];
int maxLen[MAXLen][MAXLen];
int MaxCommonMain()
{
while(scanf("%s%s",seq1+1,seq2+1)>0)
{

int length1=strlen(seq1+1);
int length2=strlen(seq2+1);

for(int i=0;i<=length1;i++)
maxLen[i][0]=0;
for(int j=0;j<=length2;j++)
maxLen[0][j]=0;

for(int i=1;i<=length1;i++)
{
for(int j=1;j<=length2;j++)
{
if(seq1[i]==seq2[j])
maxLen[i][j]=maxLen[i-1][j-1]+1;
else
maxLen[i][j]=maxLen[i-1][j]>maxLen[i][j-1]?maxLen[i-1][j]:maxLen[i][j-1];
}
}

printf("%d/n",maxLen[length1][length2]);

// printf("%d",maxLen[length2-1][length1-1]);

}
return 0;
}


【博客整理】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: