解题思路:

(1)最长公共子序列和最长公共子串的区别是,前者可以不连续,后者必须是连续的。

(2)因此在构造状态转移方程时,比较的两个字母不相同时,前者的最优解为不包含任意一个字母的两个子串的最优解的较大者,而后者的最优解为0。

(3)在输出结果时,前者输出的是存储结果的数组的最后一个数,后者需要遍历二维数组输出最大值,而非最后一个数。


注意事项:

好像用string比用char*传参方便,以后决定不用char*了。


参考代码:

// 题目 2086: 蓝桥杯算法提高VIP-最长公共子序列
#include <iostream>
#include <cstring>

using namespace std;

int longestCommonSubsequence(string str1, string str2); // lcs
int main() {
	// 读输入
	string str1;
	string str2;
	cin >> str1 >> str2;

	cout << longestCommonSubsequence(str1, str2) << endl;
	return 0;
}

int longestCommonSubsequence(string str1, string str2) {
	int len1 = str1.size(); // str1的长度
	int len2 = str2.size(); // str2的长度
	int res[len1 + 1][len2 + 1]; // 存储最优解,res[i][j]代表包含str1前i个和str2前j个元素的子串的lcs
	memset(res, 0, sizeof(res)); // 初始化
	for (int i = 1; i < len1 + 1; i++) {
		for (int j = 1; j < len2 + 1; j++) {
			if (str1[i - 1] == str2[j - 1]) {
				res[i][j] = res[i - 1][j - 1] + 1; // 同一个字母,返回不包含这两个字母的子串的最优解+1
			} else {
				res[i][j] = max(res[i - 1][j], res[i][j - 1]); // 不同,返回不包含任意一个字母的子串的最优解
			}
		}
	}
	return res[len1][len2]; // 返回最后一个值,即str1和str2的最优解
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论