1. 程式人生 > >給出兩個字串,找到最長公共子序列(LCS),返回LCS的長度。C實現

給出兩個字串,找到最長公共子序列(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請按任意鍵繼續. . .