|
0 |
1 |
2 |
3 |
4 |
... |
n |
0 |
0 |
0 |
0 |
0 |
0 |
… |
0 |
1 |
0 |
|
|
|
|
|
|
2 |
0 |
|
|
|
|
|
|
3 |
0 |
|
|
|
|
|
|
4 |
0 |
|
|
|
|
|
|
… |
… |
|
|
|
|
|
|
m |
0 |
|
|
|
|
|
|
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
|
|
yi |
B |
D |
C |
A |
B |
A |
0 |
xi |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
A |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
2 |
B |
0 |
1 |
1 |
1 |
1 |
2 |
2 |
3 |
C |
0 |
1 |
1 |
2 |
2 |
2 |
2 |
4 |
B |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
5 |
D |
0 |
1 |
2 |
2 |
2 |
3 |
3 |
6 |
A |
0 |
1 |
2 |
2 |
3 |
3 |
4 |
7 |
B |
0 |
1 |
2 |
2 |
3 |
4 |
4 |
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
|
|
yi |
B |
D |
C |
A |
B |
A |
0 |
xi |
|
|
|
|
|
|
|
1 |
A |
|
↑ |
↑ |
↑ |
↖ |
← |
↖ |
2 |
B |
|
↖ |
← |
← |
↑ |
↖ |
← |
3 |
C |
|
↑ |
↑ |
↖ |
← |
↑ |
↑ |
4 |
B |
|
↖ |
↑ |
↑ |
↑ |
↖ |
← |
5 |
D |
|
↑ |
↖ |
↑ |
↑ |
↑ |
↑ |
6 |
A |
|
↑ |
↑ |
↑ |
↖ |
↑ |
↖ |
7 |
B |
|
↖ |
↑ |
↑ |
↑ |
↖ |
↑ |
完整程序:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include <string.h>
#include<bits/stdc++.h>
using namespace std;
//计算最长公共子序列的动态规划算法
#define NUM 100
int c[NUM][NUM];
int b[NUM][NUM];
void LCSLength(int m,int n,const char x[],char y[])
{
int i,j;
//数组c的第0行、第0列置0
for (i =1;i<=m;i++)
c[i][0]=0;
for(i =1;i<=n;i++)
c[0][i] = 0;
//根据递推公式构造数组c
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]=2;
}
else
{
c[i][j]=c[i][j-1]; //←
b[i][j]=3;
}
}
}
void PrintLCS( const char x[], int i, int j)
{
if(i == 0 || j == 0)
return;
if(b[i][j] == 1)
{
PrintLCS(x,i-1,j-1);
printf("%c ", x[i-1]);
}
else if(b[i][j] == 2)
PrintLCS(x, i-1, j);
else
PrintLCS(x, i, j-1);
}
int main()
{
// char x[NUM] = {"ABCBDAB"};
// char y[NUM] = {"BDCABA"};
cout<<"请输入两个字符串"<<endl;
string x1,y1;
cin>>x1>>y1;
char x[NUM];
char y[NUM];
strncpy(x,x1.c_str(),x1.length()+1);///s.c_str() 字符强制转化为字符串函数
///长度必须加1,\0还占一个位置
strncpy(y,y1.c_str(),y1.length()+1);
int m, n;
m = strlen(x);
n = strlen(y);
LCSLength(m,n,x,y);
PrintLCS(x, m, n);
return 0;
}