一.前言
如上
二.内容
这个问题有点抽象和复杂,我们可以看一个具体的例子。
上表如下:(我是用程序实现的)
得出公式如下:
然后用C语言实现这个具体问题。
#include<stdio.h>//求最长公共子序列的长度
//#include<string.h>
int main(){
int max(int a,int b);
int i;//循环变量
int j;//循环变量
int a[7][8];
char s2[7];//B
char s1[8];//A
int n;//A
int m;//B
scanf("%d",&n);//A的串长
scanf("%d",&m);//B的串长
scanf("%s",s1+1);//输入A串 ,从s1[1]开始存放A串
scanf("%s",s2+1);//输入B串 ,从s2[1]开始存放B串
for(i=0;i<=m;i++){
for(j=0;j<=n;j++){
if(i==0||j==0){
a[i][j]=0;
continue;
}
else if(s2[i]==s1[j]){
a[i][j]=a[i-1][j-1]+1;
}
else {
a[i][j]=max(a[i][j-1],a[i-1][j]);
}
}
}
//输入二维数组,记录表
for(i=0;i<=m;i++){
for(j=0;j<=n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int max(int a,int b){//求最大值
return a>b?a:b;
}
经过了这个问题的探寻,可以求解原问题。
代码如下:
#include<stdio.h>//求最长公共子序列的长度
//#include<string.h>
int main(){
int max(int a,int b);
int i;//循环变量
int j;//循环变量
int a[1001][1000001];
char s2[1001];//B
char s1[1000001];//A
int m;//B
int n;//A
scanf("%d",&n);//A的串长
scanf("%d",&m);//B的串长
scanf("%s",s1+1);//输入A串 ,从s1[1]开始存放A串
scanf("%s",s2+1);//输入B串 ,从s2[1]开始存放B串
s1[0]='#';
s2[0]='#';
for(i=0;i<=m;i++){
for(j=0;j<=n;j++){
if(i==0||j==0){
a[i][j]=0;
continue;
}
else if(s2[i]==s1[j]){
a[i][j]=a[i-1][j-1]+1;
}
else {
a[i][j]=max(a[i][j-1],a[i-1][j]);
}
}
}
//显示最长公共子序列的长度
printf("%d",a[m][n]);
return 0;
输入二维数组,记录表
// for(i=0;i<=m;i++){
// for(j=0;j<=n;j++){
// printf("%d ",a[i][j]);
// }
// printf("\n");
// }
}
int max(int a,int b){//求最大值
return a>b?a:b;
}