最长公共子序列(LCS)

详解最长公共子序列问题(三种方法) C++分别利用三种动态规划解决最长公共子序列问题 阅读详情

问题描述:给定两个字符串s1s2...sn和t1t2...tn。求出这两个字符串最长的公共子序列的长度。字符串s1s2...sn的子序列指可以表示为Si1Si2...Sim(i1<i2<...<im)的序列。

限制条件

1<=n,m<=1000

样例

输入

n=4

m=4

S="abcd"

T="becd"

输出

3(“bcd”)

分析:

设置一个二维数组,dp[n+1[n+1],当检查到Si+1与Ti+1时,有以下三种情况:

1.相等,则在dp[i+1][j+1]中赋dp[i][j]+1。

2.不相等,则S1到Si+1和T1到Ti+1对应的公共子序列是S1...Si和T1...Tj+1或者S1...Si+1和T1...Tj的子序列。此时dp[i+1][j+1]应赋值为max(dp[i][j+1],dp[i+1][j])

另外,在给出S和T的时候,我认为m是没有用处的,m必须与n同值,否则无法保证结果的长度正确。

代码如下:

 

#include<algorithm>
#include<iostream>
using namespace std;
int n, m;//n为实例字符串长度,m为子序列长度,个人认为m没有一点用处
char s[1000], t[1000];//字符串
int dp[1001][1001];//记忆化数组,为最大值加1防止溢出
void solve()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (s[i + 1] == t[j + 1])
			{
				dp[i + 1][j + 1] = dp[i][j] + 1;//如果相等,则加一
			}
			else
			{
				dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
			}
		}
	}
	cout << dp[n][m];
}

 

 

 

 

 

【Python】最长公共子序列LCS LCS的定义 最长公共子序列,即Longest Common Subsequence,LCS。 一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列; 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列。 字符串13455 与245576的最长公共子序列为455 字符串acdfg与adfc的最长公共子序列为adf 注意区别最长公共子串(Longest C... 阅读详情

相关推荐

最长公共子序列(LCS问题)

先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC。这里解决的问题就是需要一种算法可以快速的计算出这个最大的子序列,当然,用最简单的方法就是列出XY全部的子系列然后一个个对比,但这样的时间复杂度是绝对不能接受的。假设X的长度是m,Y的长度是n,拿X的一个子序列和Y进行对比的时间是n,计算X的全部子序

小梦馆 4592

三个序列的最长公共子序列

问题描述 给定三个长度不超过200的整数序列X,Y,Z,求他们的最长公共子序列。序列中的数字均为10000以内的正整数。 例如:下列三个序列的最长公共子序列长度为4,为<1,3,9,15>。 X=<1,3,5,7,9,11,13,15> Y=<0,1,3,6,9,12,15,18> Z=<1,2,3,4,9,10,15,20> 输入格式 ...

Akid小李的博客 2022

最长公共子序列——LCS(c/c++ 伪代码)

给定两个序列 X,Y,求X和Y的长度最长的公共子序列 背包二维,一维优化

THOOOR的博客 3635

【LeetCode】【总结】 三大子序列最值问题(最长公共子序列、最长上升子序列、最长回文子序列)

做力扣的时候发现都可以用动态规划的方法解决上述三个子序列问题,并且发现三者之间有些关联。下面先挨个分析各个问题: 1、最长公共子序列 如下图所示,这是两个字符串,从中找出之间的公共子序列。 则最长公共子序列为: 我们可以通过动态规划的方法解决问题,重点就是如何原问题分解成子问题,我们发现如果两个字符串的最后一个字符相等,即str1[i] = str2[j],那么我们可以将其分...

每天进步一点点 851

最长公共子序列(LCS)问题

LCS问题描述 定义:最长公共子序列(Longest Common Subsequence),即定义两个序列X和Y,求X和Y的最长公共子序列(子序列:一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列) 例如:字符串13455与245576的最长公共子序列为455 LCS的意义:LCS可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。 LCS解法的探索...

bohenmian的博客 656

Algorithm LCS最长公共子序列

算法: 递归法:对于序列A[0,n]]和B[0,m],LCS(A,B)无非三种情况 若A或B为空,则取作空序列,作为递归基 如果末字符相等,即A[n]=B[m]=‘X’,则取LCS(A[0,n),B[0,m))+‘X’,如果前者可以求解,则问题的规模被缩小 如果末字符不相等,即A[n]!=B[m],比如A[n]=a,B[m]=b,则a和b至多有一个会出现在最后的解里(对解有贡献)。因为...

A land whole of flowers. 304

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

首先我们来区分一下子序列和子串: 子串是连续的,子序列是一个字符串中删除若干元素后形成的(两个元素前后相对顺序不变) 子序列包含子串 例:str = abcdefg 子串:cde 子序列:acf 问题 F: 最长公共子序列 题目描述 一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" , 顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串长度 输入 第一行两个字符串用空格分开。两个串的长度均小于2000 。 输出.

weixin_58346595的博客 1290

最长公共子序列问题动态规划解决,二个或者三个字符串的

哈工大算法实验二,最长公共子序列问题,动态规划解决LCS 1.实现基于优化子结构的递归求解算法 2.实现基于动态规划的求解算法 3.实现三个字符串最长公共子序列的动态规划算法 4.有界面源代码和实验报告!均为自己所做,正确运行。报告中还有用Excel表分析了算法的性能

三个字符串的最长公共子序列

这个问题是最简单的动态规划问题了,只不过是三个字符串而已。         学过动态规划的应该都知道怎么求两个字符串的最长公共子序列,很容易犯的一个错误就是:先求出前两个字符串的最长公共子序列,然后再求他和第三个字符串的最长公共子序列。举个简单的例子,三个字符串分别为abc、cab、c,前两个的最长公共子序列为ab,ab和c的公共子序列为空,实际上他们都有一个字符c,所以这种做法是错误的。

Hot Will的专栏 7220

【保姆级教程/代码】GNSS反演大气可降水量(Precipitable Water Vapor, PWV)

GPS精密单点定位(PPP)是一种采用精密卫星星历和卫星钟差进行非差单点定位的方法,在观测过程中采用双频载波相位观测法以确保高精度定位精度。本文利用PPP技术来求解天顶对流层延迟(zenith tropospheric delay,ZTD)。ZTD由湿延迟(ZWD)和干延迟(ZHD)组成,其中占比90%的ZHD与地面测站高程、大气压和测站纬度等参数有良好的相关性,可以通过Saastamoinen模型精确求出;

weixin_43910227的博客 2929

什么是深度展开网络?如何将迭代算法的每一次迭代展开成深度网络对应的一层?深度展开网络进行端对端训练,其中端对端是什么意思?

在深度学习和机器学习的背景下,“端到端”(End-to-end)训练指的是将输入数据直接映射到最终输出的过程,而不需要任何中间的手动数据预处理或特征工程。- **自然语言处理**:端到端自然语言处理系统可以将自然语言输入直接转化为计算机可理解的语言输出,而不需要对语言进行分解和转化。- **推荐系统**:通过使用深度神经网络,端到端推荐系统可以直接根据用户历史行为预测其未来的兴趣爱好,并推荐相应的产品或服务。4. **直接映射**:从输入到输出的直接映射,中间没有任何拆分或分解的过程。

m0_67897882的博客 5440

最长公共子序列(LCS)

一、概念1.给定字符串str = "ABCDADNENXY"    子序列:从str中任意去掉若干个(含0个)字符,剩下的就是这个str的子序列,如ABC, ABXY, DADXY等,中间不必连续.    子串:和子序列不同,子串必须是连续的,如ABCD,ENXY,CDADNE都是子串,而AXY不是,因为中间断开了,把连续.    子串必定是子序列,子序列不一定是子串.2.最长公共子序列(Long...

tensory的博客 2万+

数据预处理之数据平滑处理#matlab

介绍基于 MATLAB 的数据平滑方法,主要介绍 smooth 函数、smoothts 函数和 medfilt1 函数的用法。

m0_56619132的博客 2417

动态规划-求最长公共子序列LCS长度-输出所有的最长公共子序列LCS-Java实现

题目:给定两个序列X={x1,x2,…xm},Y={y1,y2,…yn},找出X和Y的最长公共子序列。 分析: 1 最长公共子序列概念 实现明确一个点就是,子序列是一个序列中去掉若干元素后得到的序列,也就是说子序列的元素下标是递增的就行,不需要在原序列中连续。 最长公共子序列,显而易见就是序列X和Y都有的最长的子序列。 2 BruteForce 暴力求解法 对于序列X的所有长度不超过Y的子序列,都...

天天开心 2730

手把手教你用光耦搭建安全隔离电路:从洗衣机控制板到PLC输入模块实战

本文通过洗衣机控制板驱动高压电机和PLC输入模块采集现场信号两个实战场景,手把手教你使用光耦搭建安全隔离电路。文章详细解析了电路架构、关键器件选型、参数计算、仿真验证及PCB布局避坑技巧,并对比了光耦与数字隔离器的适用场景,帮助电子工程师掌握这门保障系统稳定与安全的必备技能。

h6j7k8l9p0的博客 464

华为2024机考真题集合

2.中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以 2,所得的结果就是中位数。在实际考试中会随机抽三道题目进行考察,其中两道100分卷题和一道200分卷题,总共400分。幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。3.查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数。1.众数是指一组数据中出现次数量多的那个数,众数可以是多个。

qq_25360769的博客 5093

『经典DP入门』LCS 最长公共子序列问题

最长公共子序列问题(Longest Common Subsequence problem):给定两个序列X = <x1,x2,...,xm>和Y = <y1,y2,...,yn>,求X和Y长度最长的公共子序列。 注:本文的大多数概念及求解方法来自《算法导论》 使用动态规划求解LCS问题过程: 一、刻画最长公共子序列的特征 LCS的最优子结构定理:设X={x1,x2,...

Miserable_ccf的博客 7309

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 349

最长公共子序列问题(LCS)

问题描述:给定两个序列X=< x1,x2,x3,…,xm >和Y=< y1,y2,y3,…,yn >,求X和Y长度最长的公共子序列

努力努力再努力x 717

matlab 点云均值、中值、高斯滤波【2024最新版】

点云均值滤波、中值滤波、高斯滤波的matlab自带函数实现。博客长期更新,本文最近一次更新时间为:2024年11月9日。

点云侠的博客 5261

倒立摆的PLC控制(模型分析+ SCL源代码)

首先简单介绍下倒立摆模型,下面这幅图是MATLAB网站上的倒立摆模型,下面我们利用牛顿第二运动定律建立摆杆的运动方程。

RXXW_Dor的博客 3336
上一篇: dp中的简化背包问题
下一篇: pytorch 单机多GPU训练RNN遇到的问题
srplus
博客等级 码龄10年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值