最长公共子序列(LCS)

两个字符串的最长公共子序列(可以不连续) 问题:给定两个字符串,输出其最长公共子序列及其长度。 解法:此问题为动态规划的经典问题。解题有固定套路利用二维数组C,和标志位数组FLAG(表示回溯方向): 步骤一:构建二维数组,求得最长公共子序列的长度。 步骤二:利用数组C构建数组FLAG。 步骤三:利用初始字符串和FLAG回溯输出最长公共子序列。 数组C的构建方式: 回溯输出最长公共子序列过程: 上图中的箭头即为 阅读详情

简单来说,就是求两个字符串的最长公共子序列

这里加上个知识点

子序列:可以不连续,比如a b c d 中的a c d 就是子序列

子串:必须连续

思路:建立一个数组dp[i][j],表示第一个数组从第一个元素到第i个元素,第二个数组从第一个元素到第j个元素,这两个区间的最大公共子序列。

这样,首先把dp[0][j]和dp[i][0]都定义为0,因为第0个位置的最大公共子序列肯定是0吧?

然后就是遍历了,两重遍历,如果相等,取左上角的值加1,不相等,取上方或左方的最大值。

附上代码:

#include <cstdio>  
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <stack>
#include <queue>
using namespace std;
#define ll long long
int dp[1111][1111];
char a[1111];
char b[1111];
void max()
{
	int na = strlen(a);
	int nb = strlen(b);
	for(int i = 0;i < nb;i++)
		dp[0][i] = 0;
	for(int i = 0;i < na;i++)
		dp[i][0] = 0;
	for(int i = 0;i < na;i++)
		for(int j = 0;j < nb;j++)
			if(b[j] == a[i])
				dp[i+1][j+1] = dp[i][j]+1;
			else
				dp[i+1][j+1] = max(dp[i+1][j],dp[i][j+1]);
	cout << dp[na][nb] <<endl;
}
int main()
{
	while(cin >> a >> b)
		max();
	return 0;
}

【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

最长公共子序列(附C语言实现)

最长公共子序列  最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Substring)。其定义是,一个数列 S ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。  动态规划的一个计算最长公共子序列的方法如下:  以两个序列 X、Y 为例子:  设有二维数组 f[i,j] 表示 X 的

荒芜之地 1403

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

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

THOOOR的博客 3635

c语言最长公共子序列_算法学习笔记(58): 最长公共子序列

(为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是写一下笔记。今后不排除你们还会看到最小生成树、背包等基础算法的笔记……)最长公共子序列(Longest Common Subsequence,LCS)是动态规划中的经典问题,顾名思义,即求两个序列最长...

weixin_39553776的博客 991

最长公共子序列(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

64、最长公共子序列-II(不连续)

一、描述 给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列 二、最长公共子序列和最长公共子串的区别 子序列:即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。 子串:给定串中任意个连续的字符组成的子序列称为该串的子串。 给一个图再解释一下: 子序列: {a,b,c,d,e,f,g,h},它的子序列示例: {a,c,e,f} 即元素b,d,g,h被去掉后,保

sunnnnh的博客 967

如何入门强化学习

很多同学在入门强化学习的时候都会遇到困难,那我这里就简单介绍一下应该如何入门强化学习,并以开源代码为例详解强化学习实战。

seeksister的博客 3304

最长公共子序列(不连续)

一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。 例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但是不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。 寻找LCS的一种方法是枚举X所有的子序列,然后注意检查是否是Y

偏离的定弦 906

vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制

技术无关,独立开发,独立部署,增量升级,独立运行,微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用。

前端开发工程师 9750

【上海大学计算机组成原理实验报告】五、机器语言程序实验

机器语言程序实验//理解计算机执行程序的实际过程//学习编制机器语言简单程序的方法//将R1中的数值左移n次送OUT,其中n是R2中的数值。(指令码从10开始)//完成R3=R0×R1,结果送OUT。(指令码从30开始)//建立“中文汇编指令”需要哪些条件?//上海大学计算机组成原理实验报告

HackerKevon的博客 2188

最长公共子序列(LCS)

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

tensory的博客 2万+

【Cadence】Virtuoso@LayoutXL 差分电路版图同步修改

对于差分电路,器件和部分走线通常是对称的,只需要画一半,另一半通过镜像操作完成。因此,需要对差分电路进行同步的修改,保证电路的差分对称性和正确的连接关系。然而,通常版图会经过多次修改,修改的部分可能在镜像的时候被遗漏。左边画了金属块,右边也出现了同步出现了金属块。进入group会有同步复制的提示。

乾巽的博客 3050

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

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

Miserable_ccf的博客 7309

C语言 函数

一、什么是函数 二、函数的相关语法 三、函数编码规范

m0_57105760的博客 1891

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 464

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

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

天天开心 2729

VS2019编译配置Easy3D

VS2019编译配置Easy3D

dayuhaitang1的博客 2596

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

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

努力努力再努力x 716

工业相机的检测原理课件(建议收藏)

本课件为各位工程师详细介绍了工业相机的视觉检测原理 ,旨在为工程师调试工业相机的视觉检测原理时提供理论性指导。

Bamboo265925的博客 498

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

图解最长公共子序列LCS问题

很多人在上学的时候都有过对毕业论文进行查重的经历,一般可以通过CNKI,知网等平台提交自己的论文,平台将论文与其他论文进行匹配查重,最终得到一个相似度。不知大家对于查重问题有没有思考过,他背后是如何实现的呢?难道就是找到相似的字符串匹配就可以吗?本篇文章就带大家了解一种可以解决这个问题的经典算法。 本文主要主要包含以下三方面: 什么是LCS 如何实现LCS计算 LCS的使用场景 1. 什么是LCS 最长公共子序列,英文名称为Longest Commo...

Mike's Tech Blog 1935

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: KMP算法心得
下一篇: POJ 2533——最长上升子序列
MMMMMMMW
博客等级 码龄9年 34粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值