最长公共子串 Longest Common Subsequence

最长公共子序列(Longest Common Subsequence)-- 动态规划 最长公共子序列(Longest Common Subsequence )问题:给定两个序列,找出两个序列中存在的最长子序列的长度。 子序列是以相同的相对顺序出现,但不一定是连续的序列。 例如,“ abc”,“ abg”,“ bdf”,“ aeg”,“ acefg”等是“ abcdefg”的子序列。 首先我们考虑一下采用暴力解法的时间复杂度,长度为n的字符串的子序列一共有$C_{n}^{1} $ ... 阅读详情

动态规划的经典题!

package DP;

import java.util.Arrays;

// 最长公共子串 Longest Common Subsequence
public class LCS {

	static int dp[][] = null;
	
	public static void main(String[] args) {
		String a = "ABCABCBAASJKDFHSDDSJSAHJSD";
		String b = "CBABCABCCSDESJASDFHSDFSW";
		
		dp = new int[a.length()+1][b.length()+1];
		for(int[] row : dp){
			Arrays.fill(row, -1);
		}
		
		System.out.println(lcs2(a.toCharArray(), a.length(), b.toCharArray(), b.length()));
		System.out.println(lcs3(a.toCharArray(), a.length(), b.toCharArray(), b.length()));
//		print();
		System.out.println(lcs(a.toCharArray(), a.length(), b.toCharArray(), b.length()));
		
	}

	// 纯递归O(m*2^n)
	public static int lcs(char[] A, int m, char[] B, int n){
		if(m==0 || n==0){
			return 0;
		}
		
		if(A[m-1] == B[n-1]){
			return 1 + lcs(A, m-1, B, n-1);
		}else{
			return Math.max(lcs(A, m, B, n-1), lcs(A, m-1, B, n));
		}
	}
	
	// DP, top-down O(n^2)
	public static int lcs2(char[] A, int m, char[] B, int n){
		if(m==0 || n==0){
			return 0;
		}
		
		// 如果已经存在dp数组中,直接返回
		if(dp[m][n] != -1){
			return dp[m][n];
		}
		int res = 0;
		if(A[m-1] == B[n-1]){
			res = 1 + lcs2(A, m-1, B, n-1);
		}else{
			res = Math.max(lcs2(A, m, B, n-1), lcs2(A, m-1, B, n));
		}
		dp[m][n] = res;		// 把新值记录到dp数组中
		return res;
	}
	
	// DP, bottom-up O(n^2)
	public static int lcs3(char[] A, int m, char[] B, int n){
		for(int i=0; i<=m; i++){
			for(int j=0; j<=n; j++){
				if(i==0 || j==0){
					dp[i][j] = 0;
				}
				else if(A[i-1] == B[j-1]){
					dp[i][j] = dp[i-1][j-1] + 1;
				}
				else{
					dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
				}
			}
		}
		return dp[m][n];
	}
	
	public static void print(){
		for(int i=0; i<dp.length; i++){
			for(int j=0; j<dp[0].length; j++){
				System.out.print(dp[i][j] + " ");
			}
			System.out.println();
		}
	}
}





Ref:

http://www.csie.ntnu.edu.tw/~u91029/LongestCommonSubsequence.html

http://www.geeksforgeeks.org/dynamic-programming-set-4-longest-common-subsequence/

http://techieme.in/techieme/dynamic-programming-longest-common-subsequence/

http://www.cc.gatech.edu/~ninamf/Algos11/lectures/lect0311.pdf

http://blog.gaurav.im/?p=9

http://blog.youkuaiyun.com/alexander_xfl/article/details/11556655

最长公共子串LCS (Longest Common Subsequence) 算法 三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正。同时有新的想法,也可以提出! 采用顺序结构存储串,求串s和串t的一个最长公共子串。 方法一 算法思想:借助二维数组可以求出最长公共子串最后一个字符分别在s串和t串中的数组下标。此时可以从s中截取最长公共子串,也可以从t中截取。 SqString MaxComStr(SqString s, SqString t) { SqString str; in 阅读详情

相关推荐

Longest Common Subsequence (LCS)最长公共子串

Longest CommonSubsequence (LCS). The following are some instances. a)      X: xzyzzyx   Y: zxyyzxz b)     X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD               Y:MAEEEVAKLE

chen 2680

Longest Common Subsequence

问题描述 LCS 的定义: Longest Common Subsequence,最长公共子序列,即两个序列 X 和 Y 的公共子序列中,长度最长的那个,并且公共子序列不同于公共字串,公共子序列可以是不连续的,但是前后位置不变。 LCS 的意义: 求两个序列中最长的公共子序列的算法,广泛的应用在图形相似处理、媒体流的相似比较、计算生物学方面。生物学家常常用该算法进行基因序列比对,由此推测序列的结构...

xhj_enen的博客 3041

【论文阅读】High-Resolution Image Synthesis with Latent Diffusion Models

为了降低训练扩散模型的算力,LDMs使用一个Autoencoder去学习能尽量表达原始image space的低维空间表达(latent embedding),大大减少需要的算力。在RGB空间:编码器encoder:,将x压缩成低维表示解码器decoder: D,将低维表示z还原成原始图像空间。1. 加入Autoencoder(上图中左侧红色部分),使得扩散过程在latent space下,提高图像生成的效率;

weixin_57974242的博客 1万+

LCS算法的概述及由来(LCS)最长公共子序列

第一节、问题描述     什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。     举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。     注意最长公共子串(Longest CommonSubst

bokzmm的博客 1241

LSTM模型 轨迹经纬度预测

原始时间序列数据如下所示,我们只取前两列纬度和经度作为输入数据 我们设定用前六个位置信息预测下一个位置,则两个样本的输入输出数据如下所示: 创建LSTM网络训练模型: import numpy as np from keras.layers.core import Dense, Activation, Dropout from keras.layers import LS...

Muzi_Water的博客 2万+

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

weixin_57514792的博客 1103

最长公共子序列(Longest Common Subsequence, LCS)

否则,最长公共子序列可能来自 X[1..i−1] 与 Y[1..j] 的最长公共子序列,也可能来自 X[1..i] 与 Y[1..j−1] 的最长公共子序列,取两者中的较大值。[ L[i][j] = \begin{cases} L[i-1][j-1] + 1, & \text{如果 } x_i = y_j \ \max(L[i-1][j], L[i][j-1]), & \text{如果 } x_i \neq y_j \end{cases} ],yn​,它们的最长公共子序列 Z=z1​,z2​,…

qq_69100706的博客 804

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2236

最长公共子序列LCS(动态规划)—详解

一.基本概念 1、 子序列(subsequence): 一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序)。例如序列<A,B,C,B,D,A,B><A,B,C,B,D,A,B>的子序列有:<A,B><A,B>、<B,C,A><B,C,A>、<A,B,C,D,A><A,B...

weixin_44023658的博客 1万+

YOLOv8深度集成SDFM:显著增强特征细节与多尺度融合,实现小目标检测革命性提升

本文介绍了如何将SDFM(Superficial Detail Fusion Module)模块集成到YOLOv8目标检测模型中,以提升特征融合效能。SDFM通过精细的特征预校准、通道注意力机制和动态加权融合策略,有效解决了多尺度特征融合中的细节保留问题。实验表明,集成SDFM后YOLOv8的mAP50-95提升12.7%,召回率提升9.0%,精确率提升5.9%,显著增强了模型性能。教程详细阐述了SDFM的工作原理、代码实现步骤及优化思路,为研究者和开发者提供了实用的技术指南。

FJN110的博客 117

安全与加密常识(10)linux系统证书管理

1. 将自定义CA证书(如my-ca.crt)放到源目录# 2. 编辑配置文件,启用该证书(末尾添加一行 my-ca.crt)# 3. 执行命令同步(核心工作环节)# 4. 验证结果:检查是否生成哈希链接和合并到证书束ls /etc/ssl/certs/my-ca.pem # 证书文件ls /etc/ssl/certs/$(openssl x509 -hash -noout -in /usr/share/ca-certificates/my-ca.crt).0 # 哈希链接。

二进制君 282

最长公共子串(Longest Common Substring)和最长公共子序列(Longest Common Subsequence)

最长公共子串(Longest Common Substring)和最长公共子序列(Longest Common Subsequence),Java实现代码,主要思想是动态规划算法

qq_43251731的博客 398

cuRobo 入门教程(一)基于CUDA的机器人运动规划加速库

cuRobo是一款基于CUDA加速的机器人算法库,提供运动学计算、碰撞检测、轨迹优化等功能。该库采用并行优化技术,在GPU上实现高效运算,比现有方案快60倍。cuRobo支持多种机器人模型和环境表示,包含正向/逆向运动学、无碰撞轨迹生成、模型预测控制等核心算法,并可与IsaacSim等仿真平台集成。其特点包括:1) 支持多种碰撞检测方式(长方体/网格/深度图像);2) 提供批量环境处理和实时世界更新;3) 通过CUDA Graphs加速优化迭代;4) 在Jetson Orin等平台实现毫秒级运动规划。安装支

2506_90492529的博客 1924

求最长公共子串 Longest Common Subsequence

最长公共子串  // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*---------------------------------------------------- 题为求 最长对称子串, 实际可以转化成求最长公共子串对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP...

SH16666的博客 191

《网络存储技术》形考实训4:为小微企业搭建基于Windows Server的文件共享与权限管理服务

本文介绍了在域环境下部署DFS分布式文件系统的完整流程。项目目标是将3台存储服务器(NS1、NS2、NS3)上的多个共享文件夹通过DFS命名空间进行统一整合,使员工可通过单一访问路径访问所有资源。实施步骤包括:1)搭建AD域环境并创建用户/组;2)将存储服务器加入域并配置共享权限;3)在域控制器安装DFS命名空间角色;4)创建基于域的命名空间(\xc.cn\共享);5)将各服务器共享文件夹映射到命名空间;6)进行客户端访问验证。通过DFS实现了物理存储位置不变情况下的逻辑统一访问,提高了文件管理的便捷性和可

深耕计算机专业知识与技术。 946

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最长公共子序列与最长公共子串(Longest Common Subsequence, LCS)

最长公共子序列与最长公共子串 http://www.cnblogs.com/en-heng/p/3963803.html 动态规划算法解LCS问题 http://blog.youkuaiyun.com/v_JULY_v/article/details/6110269 1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs bel

say_haha的博客 738

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

算法: 最长公共子串1143. Longest Common Subsequence

1143. Longest Common Subsequence Given two strings text1 and text2, return the length of their longest common subsequence. If there is no common subsequence, return 0. A subsequence of a string is a new string generated from the original string with some c

AI架构师易筋 444

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[求最长公共子串(Longest Common Subsequence, LCS)][解题方法]

  问题 如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。        注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。       请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。       例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子...

jbm 372

poj 1458 最长公共子串(Longest Common Subsequence)

LCS问题: 给定序列 X = &lt;x1,x2,...,xn&gt; 和另一个序列 Y = &lt;y1,y2,...,ym&gt;   找两个递增的下标序列 &lt;i1, i2, ...ik&gt; 和 &lt;j1, j2, ..., jk&gt;使 xi1 == yj1 xi2 == yj2 ...... xik == yjk 令Z = &lt;xi1, xi2...

The time is passing 137

UVA - 10405 - Longest Common Subsequence (DP - 最长公共子串)

UVA - 10405 Longest Common Subsequence Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem C: Longest Commo

Never say never 887

LeetCode-DP算法 | 最长公共子序列和最长公共子串区别

转自:https://blog.youkuaiyun.com/u012426298/article/details/82796660 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序一致,并不要求连续。例如X = {a, Q, 1, 1}; Y = {a,...

hello world 472

【非原创】最长公共子串 (Longest Common Substring) 与 最长公共子序列 (Longest Common Subsequence )...

-------------------------------来自某猪的更新----------------------------------------- 在了解最长公共子序列之前,我们先了解一下最长公共子串: 给定两个字符串,求出它们之间最长的相同子字符串的长度。 举个例子,假如有两个字符串:ABCD和ABDBCDF 他们的公共子串分别有:A,B,C,D,AB,BC...

weixin_34138056的博客 181

lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)...

Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i、j个字母的最长公共子序列 class Solution { public: int findLength(vector<int>& A, vector<int>& B) { int len1 = A.size(); ...

weixin_30824277的博客 113

Longest Common Subsequence && Substirng【公共子序列及子字符串】【经典dp】

公共子序列及子字符串问题

GuoZLH的博客 793

acm动态规划之LCS最长公共子串uva10405Longest Common Subsequence解题报告

对于一般的LCS问题,都属于NP问题。当数列的量为一定的时,都可以采用动态规划去解决。动态规划的一个计算最长公共子序列的方法如下,以两个序列 X、Y 为例子:设有二维数组 f[i][j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:f[1][1] = same(1,1)f[i][j] = max{f[i-1][j-1] + same(i,j),f[i-1][j],f[i

在河之洲 728
上一篇: 最长递增子序列-Longest Increasing Subsequence
下一篇: Edit Distance 编辑距离算法 @LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值