问题描述:

给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA

问题分析:

使用递归的基础之上,进行了相应的剪枝操作,避免重复计算。

最长公共子序列_公共子序列

最长公共子序列_#include_02


代码实现:

#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;
}