给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。C实现

给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。

您在真实的面试中是否遇到过这个题? Yes
Basic Information
Tags
Related Problems
My Note
样例
给出"ABCD" 和 "EDCA",这个LCS是 "A" (或 D或C),返回1

给出 "ABCD" 和 "EACB",这个LCS是"AC"返回 2

说明
最长公共子序列的定义:

最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。
https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
// LCS_2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
	char a[500],b[500];
	char num[501][501];
    char flag[501][501];
	void LCS();
	void getLCS();
int _tmain(int argc, _TCHAR* argv[])
{
	int i;
	strcpy(a,"ABCD");
	strcpy(b,"BAB");
	memset(num,0,sizeof(num));
	memset(flag,0,sizeof(flag));
	LCS();
	printf("%d\n",num[strlen(a)][strlen(b)]);
	getLCS();
	return 0;
}
void LCS(){
	int i,j;
	for(i=1;i<=strlen(a);i++){
		for(j=1;j<=strlen(b);j++){
			if(a[i-1]==b[j-1]){
			num[i][j]=num[i-1][j-1]+1;
			flag[i][j]=1;////指向斜向上

			}else if(num[i][j-1]>num[i-1][j]){
			num[i][j]=num[i][j-1];
			flag[i][j]=2;////指向左
			}else{
			 num[i][j]=num[i-1][j];
			 flag[i][j]=3;///指向上
			}
		}
	}
}///LCS()
void getLCS(){
	char res[500];
	int k=0;
	int i=strlen(a);
	int j=strlen(b);
	while(i>0 && j>0){
	 
		if(flag[i][j]==1){
		 res[k]=a[i-1];////斜向上
		 k++;
		 i--;
		 j--;
		}else if(flag[i][j]==2){
		j--;
		
		}else if(flag[i][j]==3){
		i--;
		}
	}////while
	for(i=k-1;i>=0;i--){
	printf("%c",res[i]);
	
	}

}///getLCS()
2
AB请按任意键继续. . .

你可能感兴趣的:(算法,lcs)