问题描述:
给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA
问题分析:
使用递归的基础之上,进行了相应的剪枝操作,避免重复计算。
代码实现:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[100],b[100];
int c[100][100]= {0};//剪枝,记录路径
int dfs(int x,int y) {
if(x==0||y==0)//当两个字符串其中任意一个长度为零时最长公共子序列长度为0
return 0;
else {
if(a[x-1]==b[y-1]) {//当前对应位置字符相等时,dfs(x-1,y-1)+1;
return c[x-1][y-1]==0?c[x-1][y-1]=dfs(x-1,y-1)+1:c[x-1][y-1]+=1;
} else {//否则就看a[x-1]和b的最长公共子序列以及a和b[y-1]的最长公共子序列谁最长
return max(c[x-1][y]==0?c[x-1][y]=dfs(x-1,y):c[x-1][y],c[x][y-1]==0?c[x][y-1]=dfs(x,y-1):c[x][y-1]);
}
}
}
int main() {
scanf("%s %s",a,b);
printf("%d\n",dfs(strlen(a),strlen(b)));
return 0;
}