給出兩個字串,找到最長公共子序列(LCS),返回LCS的長度。C實現
阿新 • • 發佈:2019-02-11
給出兩個字串,找到最長公共子序列(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
2// 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()
AB請按任意鍵繼續. . .