最长公共子序列(LCS)
2015-07-17 21:51
232 查看
有三个字符串str1,str2,c。
最长公共子序列的意思是:c既是str1的子序列,又是str2的子序列。并且,c是满足上诉条件的所有子序列中最长的。
与最长公共子串的区别是:最长公共子序列中的字符在原字符串中不一定连续,最长公共子串中的字符在原字符串上连续。
由最长公共子序列问题的最优子结构性质可知,要找出X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。
参考代码如下:
最长公共子序列的意思是:c既是str1的子序列,又是str2的子序列。并且,c是满足上诉条件的所有子序列中最长的。
与最长公共子串的区别是:最长公共子序列中的字符在原字符串中不一定连续,最长公共子串中的字符在原字符串上连续。
由最长公共子序列问题的最优子结构性质可知,要找出X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。
参考代码如下:
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int main() { char str1[501],str2[501]; int len1,len2,dp[501][501]; scanf("%s%s",str1,str2); len1=strlen(str1); len2=strlen(str2); dp[0][1]=dp[1][0]=dp[0][0]=0; for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { if(str1[i]==str2[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } printf("%d\n",dp[len1][len2]); }
相关文章推荐
- MapKit的使用显示当前位置
- 动态规划专题学习之一-概述分析
- 一次只有过程没有结果的努力
- HDU 4862 Jump(最大k路径覆盖 费用流)
- UML类图几种关系的总结
- linux系统网络命令(五)
- scala中神奇的map tuple zip
- iOS第二天注意和学习重点
- Hive数据加载(内部表,外部表,分区表)
- 支撑统计学的七大支柱!
- 喵哈哈的日常选数问题(数位DP)
- 关于Service中bindService注意的几个问题
- 1046. Shortest Distance (20) 坑我
- 关于Service中bindService注意的几个问题
- Tortoise SVN 提示 clean up 然而 clean up 没卵用的解决方法
- 线段树区间修改 懒惰标记 维护和、最大值、最小值
- LINUX之文件解压与压缩汇总
- 关于解决乱码问题的一点探索之一(涉及utf-8和GBK)
- OpenCV 数字验证码识别
- 理解dynamicsAX表里的各种key