最长公共子序列

来源:互联网 发布:什么软件播放mkv 编辑:程序博客网 时间:2024/05/01 21:10
#include <cstring>#include <iostream>using namespace std;const int N=100;int c[N][N];//邻接矩阵。保存两个字符串相等的个数。///构造字符串 a 和 字符串 b 的最长子序列的长度 并保存在c[i][j]中,其中 i j 分别表示字符串的长度。int LCS_length(char a[],char b[],int c[][N]){int lena=strlen (a),lenb=strlen (b);///第0行和第0列赋初值 0。for (int i=0;i<=lena;i++) c[i][0]=0;for (int i=0;i<=lenb;i++) c[0][i]=0;for (int i=1;i<=lena;i++)for (int j=1;j<=lenb;j++){if (a[i-1]==b[j-1])c[i][j]=c[i-1][j-1]+1; //找到相等的就在它斜上方的值加一。以后就不用在数1的个数。else if (c[i-1][j] >= c[i][j-1])c[i][j]=c[i-1][j];  //更新最大的值。elsec[i][j]=c[i][j-1];}return c[lena][lenb];}//构造字符串 a 和 b 的最长公共子序列 并保存在str中。char *build_lcs (char *s,char a[],char b[]){int i=strlen (a),j=strlen (b);int k=LCS_length (a,b,c);s[k]='\0';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];i--;j--;}}return s;}int main (){char a[N],b[N],str[N];cin>>a>>b;cout<<build_lcs (str,a,b)<<endl;return 0;}

0 0
原创粉丝点击