最长公共子序列问题
来源:互联网 发布:airplayer for mac 编辑:程序博客网 时间:2024/04/28 05:06
问题描述:
最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
例如:X(A,B,C,B,D,A,B)
Y(B,D,C,A,B,A)
那么最长公共子序列就是:B,C,B,A
算法设计:用动态规划方法解决
最长公共子序列的结构:
设X = { x1 , ... , xm },Y = { y1 , ... , yn }及它们的最长子序列Z = { z1 , ... , zk }则:
1、若 xm = yn , 则 zk = xm = yn,且Z[k-1] 是 X[m-1] 和 Y[n-1] 的最长公共子序列
2、若 xm != yn ,且 zk != xm , 则 Z 是 X[m-1] 和 Y 的最长公共子序列
3、若 xm != yn , 且 zk != yn , 则 Z 是 Y[n-1] 和 X 的最长公共子序列
子问题的递归结构:
当 i = 0 , j = 0 时 , c[i][j] = 0
当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1
当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }
还是以:X(A,B,C,B,D,A,B)
Y(B,D,C,A,B,A) 为例
看下面的图:
由上面的分析:我们得到的源代码:
//最长公共子序列代码模板#include <iostream>using namespace std; #define N 105int dp[N+1][N+1];char str1[N],str2[N]; //比较两个数的大小int maxx(int a,int b){ if(a>b){ return a; } return b;} //函数功能:获取两个字符串的最长公共子序列的数目//len1:字符串1的长度//len2:字符串2的长度int LCSL(int len1,int len2){ int i,j; int len=maxx(len1,len2); for(i=0;i<=len;i++){ dp[i][0]=0;//y为空字符串 dp[0][i]=0;//x为空字符串 } for(i=1;i<=len1;i++){ for(j=1;j<=len2;j++){ if(str1[i-1]==str2[j-1]){ dp[i][j]=dp[i-1][j-1]+1; } else{ dp[i][j] = maxx(dp[i - 1][ j ] , dp[i][j - 1]) ; } } } return dp[len1][len2];} int main(){ while(cin>>str1>>str2){ int len1=strlen(str1);//获取字符串1的长度 int len2=strlen(str2);//获取字符串2的长度 cout<<LCSL(len1,len2)<<endl; } return 0; }
利用此模板能直接解决的题目:HDOJ1159 :http://acm.hdu.edu.cn/showproblem.php?pid=1159
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- (Python 2.6/3.0+)UnicodeDecodeError: 'ascii' codec can't decode
- Oracle spfile与pfile
- Oracle 基本数据查询
- Windows xp操作技巧
- Android Wifi开发 搜索AP并获取AP属性
- 最长公共子序列问题
- PC 110502 Reverse and Add //水题 字符串 模拟
- 简单消费者生产者问题
- TreeView节点快速访问之道
- JQuery 创建节点的办法
- SWFUpload V2.2.0 说明文档
- Linux IPC总结(全)
- XtraTreeList使用扎记(2)
- HDOJ 1159 Common Subsequence