Longest Common Subsequence (LCS)最长公共子串

来源:互联网 发布:福州网络棋牌公司 编辑:程序博客网 时间:2024/05/22 23:15

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"是其公共子串,但不时最长公共字串。最长公共子串的定义中,并不要求最长公共子串必须连续出现在两个字符串中,只需要能保持顺序的出现在序列中即可。

#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;}


0 0