Longest Common Subsequence (LCS)最长公共子串
2015-07-01 14:31
666 查看
Longest CommonSubsequence (LCS). The following are some instances.
a) X: xzyzzyx Y: zxyyzxz
b) X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD
Y:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG
求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题。
在开始想这道题之前应先理解什么是LCS(最长公共子串)。如串“abcbbc”,"abccbb",其中的一个字串"abc"是其公共子串,但不时最长公共字串。最长公共子串的定义中,并不要求最长公共子串必须连续出现在两个字符串中,只需要能保持顺序的出现在序列中即可。
a) X: xzyzzyx Y: zxyyzxz
b) X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD
Y:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG
求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题。
在开始想这道题之前应先理解什么是LCS(最长公共子串)。如串“abcbbc”,"abccbb",其中的一个字串"abc"是其公共子串,但不时最长公共字串。最长公共子串的定义中,并不要求最长公共子串必须连续出现在两个字符串中,只需要能保持顺序的出现在序列中即可。
#include<stdio.h> #include<stdlib.h> char X[]="MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD"; char Y[]="MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG"; int xlength = 60; int ylength = 60; //char X[100]; //char Y[100] //int xlength,ylength; int c[100][100]; char b[100][100]; int LCS_LENGTH(){ int m = xlength,n = ylength; for (int i = 1;i<=m;++i){ c[i][0]=0; } for (int j = 0;j<=n;++j){ c[0][j]=0; } for(int i = 1;i<=m;++i){ for(int j = 1;j<= n;++j){ if(X[i]==Y[j]){ c[i][j]=c[i-1][j-1]+1; b[i][j]='/'; } else if(c[i-1][j]>=c[i][j-1]){ c[i][j] = c[i-1][j]; b[i][j] ='U'; } else { c[i][j] = c[i][j-1]; b[i][j] ='L'; } } } return 0; } int printLCS(int i,int j){ if(i==0||j==0){ return 0; } if(b[i][j]=='/'){ printLCS(i-1,j-1); printf("%c",X[i]); } else if(b[i][j]=='U'){ printLCS(i-1,j); } else printLCS(i,j-1); return 0; } int main(){ /*此处是我自己设计的,有助于程序的重复利用,不仅仅是可以测试练习上的几个例子,还可以手动输入,这样才是编程的目的所在。 printf("please input the num of X sequence and Y sequence :\n"); scanf("%d%d",&xlength,&ylength); printf("please input X sequence :\n"); fflush(stdin); for(int i = 1;i<=xlength;++i){ scanf("%c",&X[i]); } printf("please input Y sequence :\n"); fflush(stdin); for(int i = 1;i<=ylength;++i){ scanf("%c",&Y[i]); } */ LCS_LENGTH(); for(int i = 1;i<= xlength;++i){ for(int j = 1;j<= ylength;++j){ printf("%d%c ",c[i][j],b[i][j]); } printf("\n"); } printLCS(xlength,ylength); system("pause"); return 0; }
相关文章推荐
- UIButton详解
- 制作支持UEFI的Windows8 PE (4)
- UEFI引导Windows启动(3)
- divide and conquer 二分查找
- iOS中使用UITableView的实现向左拉实现删除
- OAF_开发系列11_实现OAF通过DataBoundValues动态显示表列的左右对齐
- 对“传统BIOS”与“EFI/UEFI BIOS”的基本认识
- easyui required 提交验证
- 新一代UEFI BIOS UEFI基础知识介绍 (1)
- 新一代UEFI BIOS “CSM”对安装Windows的影响(11)
- Installation error: INSTALL_FAILED_UID_CHANGED 的解决办法
- ui-grid的笔记
- Implement priority queue (实现优先队列)
- db2日志报错 Bad Queue Handle
- UILabel,文字添加下划线,中划线
- View requires API level 14 (current min is 8): <GridLayout>
- Sequence Generator分析
- “413 Request Entity Too Large” 错误解决
- PHP 解决版本问题:"Assigning the return value of new by reference is deprecated"
- IOS之UITableView的header显示问题