动态规划:最长公共子序列

news2024/10/7 8:25:02

动态规划:最长公共子序列

  • 前言
  • 一、动态规划


前言

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
示例 1:
输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace” ,它的长度为 3 。
示例 2:
输入:text1 = “abc”, text2 = “abc”
输出:3
解释:最长公共子序列是 “abc” ,它的长度为 3 。
示例 3:
输入:text1 = “abc”, text2 = “def”
输出:0
解释:两个字符串没有公共子序列,返回 0 。

提示:
1 <= text1.length, text2.length <= 1000
text1 和 text2 仅由小写英文字符组成。


一、动态规划

暴力法依然可以求解本题,但是问题在于时间复杂度会超时,所以这里不再描述,只介绍动态规划这种算法

动态规划的核心思想是:
在这里插入图片描述
求公共子序列长度:

	int longestCommonSubsequence(string text1, string text2) {
	int size1 = text1.size();
	int size2 = text2.size();
	vector<vector<int>> dp(size1+1, vector<int>(size2+1, 0));
	for(int i=1;i<=size1;i++) {
		for(int j=1;j<=size2;j++) {
			if(text1[i-1] == text2[j-1]) {
			dp[i][j] = dp[i-1][j-1] + 1;
			} else {
			dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
			}
		}
	}
	return dp[size1][size2];
}

输出公共子序列的内容:

void lcsPrint(vector<vector<int>> B, string X, int i, int j) {
	if (i == 0 || j == 0) {
	return;
	}
	if (B[i][j] == 2) {
		lcsPrint(B, X, i - 1, j - 1);
		cout<<X[i-1]<<endl;
	}
	else if (B[i][j] == 1) {
		lcsPrint(B, X, i - 1, j);
	}
	else {
		lcsPrint(B, X, i, j - 1);
	}
}

int main() {
string X = "ADBCDACBA";
string Y = "ABCADBACB";
int i = 0;
int j = 0;
int size1 = X.size();
int size2 = Y.size();
vector<vector<int>> dp(size1+1, vector<int>(size2+1, 0));
vector<vector<int>> B(size1+1, vector<int>(size2+1, -1));
for(i=1;i<=size1;i++) {
	for(j=1;j<=size2;j++) {
		if(X[i-1] == Y[j-1]) {
		dp[i][j] = dp[i-1][j-1] + 1;
		B[i][j] = 2;
		} else if(dp[i-1][j] >= dp[i][j-1]){
			dp[i][j] = dp[i-1][j];
			B[i][j] = 1;
		} else {
			B[i][j] = 0;
			dp[i][j] = dp[i][j-1];
		}
	}
}
lcsPrint(B, X, size1, size2);
cout<<endl;
cout<<dp[size1][size2];
return 0;

更多内容可以参考:
动态规划 最长公共子序列 过程图解
最长公共子序列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

练习1:线性回归

练习1&#xff1a;线性回归 介绍 在本练习中&#xff0c;您将 实现线性回归并了解其在数据上的工作原理。 在开始练习前&#xff0c;需要下载如下的文件进行数据上传&#xff1a; ex1data1.txt -单变量的线性回归数据集ex1data2.txt -多变量的线性回归数据集 在整个练习中&…

【IMX6ULL驱动开发学习】09.Linux驱动之GPIO中断(附SR501人体红外感应驱动代码)

Linux驱动的GPIO中断编程主要有以下几个步骤&#xff1a; 1、 通过GPIO号获取软件中断号 (中断编程不需要设置GPIO输入输出&#xff0c;当然申请GPIO&#xff0c;设置输入也没问题) int gpio_to_irq(unsigned int gpio)参数含义gpioGPIO引脚编号 2、 注册中断处理函数&#…

k8s中docker0默认ip修改

原因&#xff1a; 由于ip冲突&#xff0c;必须要修改docker0的默认ip 过程&#xff1a; &#xff08;1&#xff09;修改文件 /etc/docker/daemon.json 添加内容 “bip”: “ip/netmask” [ 切勿与宿主机同网段 ] &#xff08;2&#xff09; &#xff08;3&#xff09;重启docke…

视觉SLAM十四讲——ch9实践(后端1)

视觉SLAM十四讲——ch9的实践操作及避坑 0.实践前小知识介绍0.1 数据集的使用 1. 实践操作前的准备工作2. 实践过程2.1 Ceres BA2.2 g2o求解BA 3. 遇到的问题及解决办法3.1 查看.ply文件时报警告 0.实践前小知识介绍 0.1 数据集的使用 Ceres BA使用的是BAL数据集。在本例中&a…

为什么说2023年最难招聘的岗位是高性能计算工程师?

随着毕业季的临近&#xff0c;高校毕业生将进入就业关键阶段。据统计&#xff0c;2023届全国高校毕业生预计达到1158万人&#xff0c;同比增加82万人&#xff0c;再创新高。尽管有千万的大学毕业生&#xff0c;但是企业反馈依然很难招聘到合适的高性能计算工程师。 这主要归因于…

看到就赚到的5款小众软件

今天推荐5款十分小众的软件&#xff0c;知道的人不多&#xff0c;但是每个都是非常非常好用的&#xff0c;有兴趣的小伙伴可以自行搜索下载。 图文识别——PandaOCR PandaOCR是一款用于识别和转换图片中的文字的工具。它可以让你对任何格式的图片进行文字识别&#xff0c;并输…

STM32速成笔记—按键检测

如果需要本文程序工程&#xff0c;请评论区留邮箱或者私信。 文章目录 一、按键检测原理二、硬件连接三、程序设计3.1 初始化GPIO3.2 按键扫描函数 四、按键控制LED4.1 初始化LED和KEY的GPIO4.2 编写按键扫描函数4.2 编写LED控制函数4.3 编写按键服务函数 五、拓展5.1 一个按键…

如何使用二维码实现配电箱巡检

施工工地的外部环境条件恶劣,加之工地上机动车辆的运行和机械设备的应用&#xff0c;均易导致电气故障的发生。现场配电箱缺乏专业技术人员的管理,易造成触电伤害、火灾等事故。现场纸质巡检存在以下问题&#xff1a; 1、信息查询不便:配电箱信息、负责人&#xff0c;历史巡检维…

Flowable服务组件-扩展组件

Flowable服务组件-扩展组件 扩展组件 文章目录 Flowable服务组件-扩展组件前言Flowable给我们提供了非常丰富的组件&#xff0c;但是在实际场景中&#xff0c;我们有需要企业个性化的组件&#xff0c;如何扩展自己的组件至关重要 一、扩展微服务回调组件二、程序步骤1.定义我们…

618父亲节,感恩的祝福送给父亲!

父亲节&#xff08;Fathers Day&#xff09;&#xff0c;是感恩父亲的节日。Fathers day, is a day of thanksgiving for fathers. 第一个提出父亲节理念的人是1906年的多德夫人。她想用一个特殊的日子来纪念她的父亲&#xff0c;她的妈妈多年前就去世了。起初&#xff0c;多德…

1.4 场效应管

1.什么是场效应管&#xff1f; 场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是一种基于电场效应调控电流的三端器件。它是一种用于电子电路中的重要元件&#xff0c;常用于放大信号、开关电路和模拟电路等应用。 场效应管主要由一个导电的沟…

git 的详细介绍使用

点击下载&#xff1a;Git下载地址 下载完成后在本地文件夹空白位置右键能看到即为安装成功 git简介&#xff1a;git是一个版本控制系统&#xff0c;见下方图详解 快速查看git的全局配置项 git config --list --global 查看指定的全局配置项 git config user.name git conf…

【Git删除大文件失败,提示WARNING: Ref ‘refs/heads/master‘ is unchanged的解决思路】

1. 问题描述 最近使用Gitee一直在独立开发某个项目&#xff0c;某次因为某个测试文件比较大&#xff0c;超过了100MB&#xff0c;gitee无法接受&#xff0c;上传失败。但是当时我没有发现上传失败&#xff0c;就没有处理&#xff0c;等到今天发现的时候&#xff0c;已经提交过…

Low-Light Image Enhancement with Wavelet-based Diffusion Models

Abstract 扩散模型在图像恢复任务中取得了很好的效果&#xff0c;但存在时间长、计算资源消耗大、恢复不稳定等问题。为了解决这些问题&#xff0c;我们提出了一种鲁棒和高效的基于扩散的微光图像增强方法&#xff0c;称为DiffLL。具体来说&#xff0c;我们提出了一个基于小波…

Vulnhub靶机:ME AND MY GIRLFRIEND_ 1

目录 介绍信息收集主机发现主机信息探测 网站探测SSH爆破 & 提权 介绍 系列&#xff1a;Me and My Girlfriend&#xff08;此系列共1台&#xff09; 发布日期&#xff1a;2019 年 12 月 13 日 难度&#xff1a;初级 运行环境&#xff1a;VMware 目标&#xff1a;取得 root…

Linux——MySQL数据库部署及自建数据库mysql-yum仓库

&#x1f618;作者简介&#xff1a;正在努力的99年打工人。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动…

如何有效提升英文口语水平?这 15 个方法值得学习!

要提升英文口语水平&#xff0c;除了多说多练&#xff0c;还有很多方法可以尝试。下面&#xff0c;小编为大家整理了15个有效的方法&#xff0c;让你说英语更自信流利&#xff01; Record yourself speaking English and listen back to your pronunciation and intonation, i…

Docker:启动,停止

1.启动一个容器&#xff1a; docker run 可选参数 镜像名 [COMMAND] [ARG...] docker run -it ubuntu /bin/bash &#xff0c;启动一个使用ubuntu的docker&#xff0c;并使用/bin/bash做为dcoker中执行的命令。 其中818d5a1c32ac为容器ID 在宿主机上&#xff0c;可以通过docke…

Citespace软件基础应用

CiteSpace软件是Citation Space的简称&#xff0c;可以译为“引文空间”&#xff0c;由美国德雷赛尔大学计算机与情报学教授陈超美博士基于Java语言开发、基于引文分析理论的信息可视化软件。 它是一款分析科学文献中蕴含的潜在知识&#xff0c;并在科学计量学、数据和信息可视…

【Git原理与使用】-- 初步认识

目录 Git版本控制器的引入 版本控制器 Git安装&#xff08;已安装可以跳过&#xff09; Linux-centos Linux-ubuntu Git基本操作 创建Git本地仓库 配置 Git 认识工作区、暂存区、版本库 工作区、版本库 stage暂存区 工作区内容使用Git管理 Git版本控制器的引入 #&…