算法设计与分析(最长公共子序列

news2024/9/20 13:01:36

目录

  • 最长公共子序列
    • 问题描述
    • 代码实现
    • 输出结果
    • 注意事项
  • 小结:

最长公共子序列

最长公共子序列(Longest Common Subsequence, LCS)问题是计算给定两个序列的最长子序列的长度,这个子序列不要求连续,但需要保持相同的相对顺序。LCS广泛应用于文本比较、DNA序列分析等领域。

问题描述

给定两个字符串,LCS的目标是找出它们之间的最长子序列。对于字符串 xy,子序列是从 xy 中删除一些字符后得到的新序列,并且删除的字符的相对顺序保持不变。比如,对于字符串 x = "abcde"y = "ace",它们的LCS是 "ace",长度为3。

该问题可以使用动态规划的方法高效地解决。我们通过构建一个二维数组来存储子问题的解,从而避免重复计算。

代码实现

#include <iostream> 

#define M 5
#define N 3

using namespace std;

// 递推求最优值
void LCSLength(int m, int n, char *x, char *y, int c[][N+1], int b[][N+1]){
	/*
	m:长度	x:字符串
	n:长度	y:字符串 
	c:最优值
	b:最优解 
	*/
	// 初始化
	for (int i=1; i<= m; i++) c[i][0] = 0;
	for (int j=1; j<= n; j++) c[0][j] = 0;
	
	for (int i=1; i<=m; i++){
		for (int j=1; j<=n; j++){
			if (x[i] == y[j]){
				c[i][j] = c[i-1][j-1] + 1;
				b[i][j] = 1;
			}
			else if(c[i-1][j] >= c[i][j-1]){
				c[i][j] = c[i-1][j];
				b[i][j] = 2; 
			}
			else {
				c[i][j] = c[i][j-1];
				b[i][j] = 3; 
			}
		}
	}
}

// 递归构建最优解
void LCS(int i, int j, char *x, int b[][N+1]) {
	// 终止条件
	if (i == 0 || j == 0) return;
	// 递归 
	if (b[i][j] == 1){
		LCS(i-1, j-1, x, b);
		cout << x[i];
	} 
	else if (b[i][j] == 2){
		LCS(i-1, j, x, b);
	}
	else{
		LCS(i, j-1, x, b);
	}
}

int main() {
	char x[M+1] = {'0', 'a', 'b', 'c', 'd', 'e'}; 
	char y[N+1] = {'0', 'a', 'c', 'e'}; 
	int c[M+1][N+1], b[M+1][N+1]; 
	
	// 最优值
	LCSLength(M, N, x, y, c, b); 
	
	// 最优解
	LCS(M, N, x, b);
}

输出结果

运行上述代码后,将输出两个字符串的最长公共子序列。对于 x = “abcde” 和 y = “ace”,输出将为:

在这里插入图片描述

注意事项

在实现LCS算法时,要注意数组索引的正确性,尤其是在处理字符数组时,确保访问正确的字符。

对于输入字符串的长度,可以根据实际需求调整常量 M 和 N,以适应不同长度的字符串。

动态规划算法的时间复杂度为O(mn),空间复杂度也为O(mn),在处理大字符串时要考虑其性能影响。

小结:

关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||竞赛资料|| ||课程资料||
添加我的公众号即可:

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

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

相关文章

如何在SpringCloud中使用Consul进行服务发现与配置管理

Spring Cloud是一个用于构建分布式系统的开发工具包。它提供了一系列解决方案&#xff0c;用于在分布式系统中管理和协调服务发现、配置管理、负载均衡、容错机制等功能。Consul是一种用于服务发现、配置管理和分布式一致性的工具&#xff0c;与Spring Cloud可以很好地集成在一…

程序员常用开发软件集合

文本编辑器 Sublime Text 编程工具 Visual Studio Code IntelliJ IDEA 数据连接客户端 Navicat DBeaver 远程连接客户端 WinSCP xshell WindTerm 流程图工具 draw.io 远程连接电脑工具 ToDesk 向日葵 teamviewer

在数据开发、消费中,如何科学治理重复数据难题?

解决这个问题&#xff0c;还得从技术系统架构和数据开发、消费的流程管理上来找原因&#xff1a; 一、数据集成或同步过程中有一些技术挑战&#xff0c;如多源异构数据集成时缺失去重策略、数据同步机制的不完善或配置错误&#xff0c;导致重复数据被多次引入系统&#xff1b;…

stable diffusion 神经网络插件 controlnet 的安装,很详细

stable diffusion 神经网络插件 controlnet 的安装&#xff0c;很详细 一、前言二、下载1、方式一2、方式二 一、前言 学到 stable diffusion 的 controlnet 插件&#xff0c;安装也略微曲折&#xff0c;这里做个记录。 下载前保证 github 能正常访问。 二、下载 1、方式一…

Mybatis续

步骤 爆红 点了右上角还是爆红不要着急&#xff0c;右下角正在下载 new 如果new的是package&#xff0c;用com.zhang&#xff0c;能事项分级 如果new的是文件夹&#xff0c;用com/zhang&#xff0c;就能实现分级。如果用com.zhang&#xff0c;则创建的文件夹名是com.zhang …

开源笔记Joplin本地Docker部署结合内网穿透实现多设备端同步笔记

文章目录 前言1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 前言 本文主要介绍如何在自己的服务器上利用docker搭建 Joplin Server&#xff0c;并对同步进行配置&#xff0c;再结合cpolar内网穿透工具实现公网远程…

神经网络拟合离散标签值

神经网络拟合离散标签值 1. 数据预处理1.1 添加参数解析1.2 数据预处理逻辑1.3 标签处理逻辑1.4 构建特征和标签1.5 数据归一化、转torch1.6 实现Dataset类 2. 定义model3. 定义train脚本3.1 loss和optimizer3.2 train3.3 predict 1. 数据预处理 1.1 添加参数解析 为了方便管…

第二证券:金价涨了!创一历史之最!

当地时间周四&#xff0c;金融商场进一步消化美联储大幅降息50个基点的利率抉择&#xff0c;认为这是为了完结美国经济“软着陆”的一次防备式降息&#xff0c;而非紧急应对阑珊风险的降息&#xff0c;加之当天公布的上星期初度申请赋闲救助人数低于预期&#xff0c;投资者对美…

B站前端错误监控实践

前言 从23年开始&#xff0c;我们团队开始前端错误监控方向的开发。经历了一些列的迭代和发展&#xff0c;从监控SDK、上报、数据治理、看板集成、APM自研可视化初步完成了一条完整且适合B站前端监控。 截止目前(2024.08.01)&#xff0c;前端监控在B站85%以上的业务线&#xf…

Linux运维培训班靠谱吗?如何判断一个培训班的教学质量?

当我们下定决心打算系统培训Linux运维时&#xff0c;哪家机构比较好成为了我们面临的最大难题。之前分享过很多培训机构的个人感受&#xff0c;但授人以鱼不如授人以渔&#xff0c;说到底那些都是我个人的看法&#xff0c;因此今天打算帮助大家学会如何判断一个培训班的好坏。 …

使用 SSCB 保护现代高压直流系统的优势

在各种应用中&#xff0c;系统效率和功率密度不断提高&#xff0c;这导致了更高的直流系统电压。然而&#xff0c;传统的电路保护解决方案不足以在保持高可靠性和安全性的同时有效保护这些高压配电系统。 固态断路器 &#xff08;SSCB&#xff09; 和电熔断器具有众多优点&…

GitLab 迁移并推送代码仓库

迁移并推送代码仓库到 GitLab 可以有多种方法,以下是一些常见的步骤: 一、创建空仓库 在 Gitlab 上创建一个空仓库 方式一:点击左上角“+”号,选择新建项目/仓库 方式二:进入“项目”界面,点击右上角“新建项目”按钮 选择“创建空白项目” 填写项目信息并点击“新…

从黎巴嫩电子通信设备爆炸看如何防范网络电子袭击

引言&#xff1a; 在当今数字化时代&#xff0c;电子通信设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;近期黎巴嫩发生的电子设备爆炸事件提醒我们&#xff0c;这些设备也可能成为危险的武器。本文将深入探讨电子袭击的原理、防范措施&#xff0c;以及网络智能…

SpinalHDL之结构(四)

本文作为SpinalHDL学习笔记第六十四篇,介绍SpinalHDL的时钟域(Clock domains)。 目录: 1.简介(Introduction) 2.例化(Instantiation) ⼀、简介(Introduction) 在SpinalHDL中, 时钟和复位信号能结合起来构成时钟域(clock domain)。时钟域可以应⽤于设计的某些区域中, 例化在…

在线安全干货|如何更改IP地址?

更改IP地址是一个常见的需求&#xff0c;无论是为了保护个人隐私、绕过地理限制还是进行商业数据分析。不同的IP更改方法适用于不同的需求和环境。但请注意&#xff0c;更改IP地址应在合法场景下进行&#xff0c;无论使用什么方法&#xff0c;都需要在符合当地网络安全法律法规…

开源链动 2+1 模式 S2B2C 商城小程序中的产品为王理念

摘要&#xff1a;本文深入探讨了在社交电商领域中&#xff0c;开源链动 21 模式 S2B2C 商城小程序如何践行“产品为王”的理念。分析了在社交电商野蛮生长时期好产品的稀缺性以及选对产品的重要性&#xff0c;同时阐述了因产品问题导致的不良后果&#xff0c;并强调了在该小程序…

Spring Boot 整合 MyBatis 的详细步骤(两种方式)

1. Spring Boot 配置 MyBatis 的详细步骤 1、首先&#xff0c;我们创建相关测试的数据库&#xff0c;数据表。如下&#xff1a; CREATE DATABASE springboot_mybatis USE springboot_mybatisCREATE TABLE monster ( id int not null auto_increment, age int not null, birthda…

一篇文章读懂什么事 LLM 训练:从预训练到微调【大模型应用入门系列】

自然语言处理&#xff08;NLP&#xff09;是人工智能领域中一项重要的研究方向&#xff0c;涉及机器对人类语言进行理解和生成。然而&#xff0c;语言的复杂性和多样性使得处理自然语言任务成为一项极具挑战性的任务。在这个领域中&#xff0c;LLM Training 扮演着至关重要的角…

Visual Studio配置opencv环境

&#xff08;1&#xff09;打开属性页面&#xff08;鼠标放在解决方案上&#xff0c;点击右键会有一个属性选项弹出&#xff09; &#xff08;2&#xff09;配置opencv的include和opencv2路径&#xff0c;具体路径和版本根据自己电脑配置 &#xff08;3&#xff09;配置opencv…

2017年国赛高教杯数学建模A题CT系统参数标定及成像解题全过程文档及程序

2017年国赛高教杯数学建模 A题 CT系统参数标定及成像 CT(Computed Tomography)可以在不破坏样品的情况下&#xff0c;利用样品对射线能量的吸收特性对生物组织和工程材料的样品进行断层成像&#xff0c;由此获取样品内部的结构信息。一种典型的二维CT系统如图1所示&#xff0c…