📄 最长公共子序列.cpp
字号:
// 最长公共子序列.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
//用c[i][j]记录序列Xi和Yj的最长公共子序列的长度,b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的,这在构造最长公共
//子序列时要用到。b[i][j]为'-1'时,表示Xi和Yi的最长公共子序列是由X(i-1)和Y(j-1)的最长公共子序列在尾部加上xi所得到的
//子序列。b[i][j]为'0'时,表示Xi和Yi的最长公共子序列与X(i-1)和Y(j)的最长公共子序列相同。b[i][j]为'1'时,表示Xi和Yi
//的最长公共子序列与X(i)和Y(j-1)的最长公共子序列相同。
//问题的最优解,即X[1:m]和Y[1:n]的最长公共子序列的长度记录于c[m][n]中。
int c[100][100],b[100][100];
void LCSLength(int m,int n,char *x,char *y,int c[][100],int b[][100])
{
int i,j;
for (i=1;i<=m;i++)
c[i][0]=0;
for(i=1;i<=n;i++)
c[0][i]=0;
for(i=1;i<=m;i++)
for (j=1;j<=n;j++)
{
if (x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]='1';
}
else if (c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]='0';
}
else
{
c[i][j]=c[i][j-1];
b[i][j]='-1';
}
}
}
void LCS(int i,int j,char *x,int b[][100])
{
if(i == 0 || j == 0)
return;
if(b[i][j] == '1')
{
LCS(i-1,j-1,x,b);
cout<<x[i];
}
else if (b[i][j] == '0')
{
LCS(i-1,j,x,b);
}
else
{
LCS(i,j-1,x,b);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char *x=" ABCBDAB";
char *y=" BDCABA";
int m=(int)strlen(x);
int n=(int)strlen(y);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
c[i][j]='-2';
b[i][j]='-2';
}
LCSLength(m,n,x,y,c,b);
LCS(m,n,x,b);
getchar();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -