最大公共子串问题

最大公共子串问题

这个是动态规划的基础题目。动态规划就是递推和重复子结构。

确定了递推关系后。找到一个能极大地减少重复运算的子结构至关重要。选的好了,时间效率会很好。

这个问题,不妨设第一个串为a,长度为n,第二个串为b,长度m。那么最长的子序列长度为f(n,m)

当a[n]=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; }

 

【博客整理】

你可能感兴趣的:(最大公共子串问题)