最长公共子序列(dp,c++)

题目:

描述:给定两个字符串A、B,求一个字符串是A和B的公共部分(公共部分可以不连续)。

解法:dp,开一个二维数组dp[i][j],表示a[1]到a[i]和b[1]到b[j]最长公共子序列,比如当a是“story”b是“sbtar”时,dp[2][3]表示st和sbt比较,最长为st,所以等于2,大概是这个图表:在这里插入图片描述

那么当a[i]==b[j]时,dp[i][j]=dp[i-1][j-1],因为如果当前字母不相等那么一定他们两个字符串添加当前两个字母的最长子序列相同。
所以当a[i]!=b[j]时,dp[i][j]=max(dp[i - 1][j], dp[i][j - 1]),意思是等于a字符串减去一个或者b字符串减去最后一个字母最长子序列的最大值(就很奇妙)。

完整代码:

#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
char a[100];
char b[100];
int dp[101][101];


int main()
{
    
    
	cin >> a >> b;
	int la = strlen(a);
	int lb = strlen(b);
	memset(dp, 0, sizeof dp);		//初始化0,因为第0个元素没有最长子序列,而且dp[1][1]之类的也要用到
	for (int i = 1; i <= la; i++)
		for (int j = 1; j <= lb; j++)
		{
    
    
			if (a[i] == b[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
			else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
		}
	cout << dp[la][lb];		//遍历到dp[i][j]是最大值
	return 0;
}

后语:不喜欢感冒,效率极低

猜你喜欢

转载自blog.csdn.net/Kyrie_irving_kun/article/details/114993637
今日推荐