最大公共子串问题
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)的矩阵,如果计算过了就直接使用
程序如下所示
【博客整理】
这个是动态规划的基础题目。动态规划就是递推和重复子结构。
确定了递推关系后。找到一个能极大地减少重复运算的子结构至关重要。选的好了,时间效率会很好。
这个问题,不妨设第一个串为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; }
【博客整理】
相关文章推荐
- 2017年A组蓝桥杯(最大公共子串问题)【动态规划】
- 最大公共连续子串(LCS问题)
- java实现字符串匹配问题之求两个字符串的最大公共子串
- 最大公共子串问题的Python解法
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 最大连续子序列和,乘积,最长递增子串,最长公共子串,子序列等问题(动态规划等)
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 动态规划 字符串最大公共子序列以及最大公共子串问题LCS
- 经典问题LCS(最大公共子串问题)C代码实现
- java实现字符串匹配问题之求两个字符串的最大公共子串
- 最大公共子串长度问题
- 最大公共子串问题
- 第八届蓝桥杯【省赛试题6】最大公共子串
- 最大公共子串的长度模板
- 第八届省赛 —— 题6 — 最大公共子串
- 求两个字符串的最大公共子串 ,不区分大小写
- SPOJ1811最长公共子串问题(后缀自动机)
- LCS最大公共子序列问题
- 最大公共子串