您的位置:首页 > 产品设计 > UI/UE

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"是其公共子串,但不时最长公共字串。最长公共子串的定义中,并不要求最长公共子串必须连续出现在两个字符串中,只需要能保持顺序的出现在序列中即可。
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: