求解最长公共子序列问题

动态规划

//求解最长公共子序列问题
#include<stdio.h>
#include<string.h>
#define N 30
int lcslength(char *a,char *b,int c[][N]){	//求c[m][n] 即最长公共子序列的长度 
	int m = strlen(a),n = strlen(b);
	int i,j;
	for(i=0;i<=m;i++)
		c[i][0] = 0;
	for(i=0;i<=n;i++)
		c[0][i] = 0;
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			if(a[i-1] == b[j-1])
				c[i][j] = c[i-1][j-1] + 1;
			else{
				if(c[i-1][j] >= c[i][j-1])
					c[i][j] = c[i-1][j];
				else
					c[i][j] = c[i][j-1];
			}
		}
	}
	return c[m][n];	                //c[m][n] 即为最长公共子序列的长度 
}
char *buildcls(char *a,char *b){	//求a,b的最长公共子序列 即字符数组s[]
	int k,i = strlen(a),j = strlen(b);
	int c[N][N];
	k = lcslength(a,b,c);       //调用lcslength()函数,返回最长公共子序列的长度
	static char s[N];			   //s[]保存a,b的最长公共子序列 
	s[k] = '\0';	//0~k-1
	while(k>0){
		if(c[i][j] == c[i-1][j])
			i--;
		else if(c[i][j] == c[i][j-1]) 
			j--;
		else{ 
			s[--k] = a[i-1];      // k = k-1    s[k-1] = a[i-1]
			i--;
			j--;
		}
	}	
	return s;
} 
int main(){
	char X[] = "abcbdb";
	char Y[] = "acbbabdbb";
	printf("X:%s\n",X);
	printf("Y:%s\n",Y);
	printf("X,Y的最长公共子序列为%s\n",buildcls(X,Y));
	return 0;
} 

  

posted @ 2020-01-05 16:30  Hqx_curiosity  阅读(240)  评论(0编辑  收藏  举报