【JAVA】查找最大公共子序列

给jetson nano 安装AX200网卡驱动 几经波折,因为在网上看到的基本都是amd版本而非arm版,然后最终选定V5.5是因为更新的几个版本的arm版本是false的(在https://kernel.ubuntu.com/~kernel-ppa/mainline/处选择版本时,得看在arm64上是false还是build succeeded,之前没经验呀刚刚才顿悟的) 1,参考文章https://blog.csdn.net/MIRANA0/article/details/106696334 学到了得下载如下四个: wget https://k 阅读详情

我们先来了解一下相关概念:
(1)子序列: 一个序列A = a1,a2,……an,中任意删除若干项,剩余的序列叫做A的一个子序列。也可以认为是从序列A按原顺序保留任意若干项得到的序列。

例如:
对序列 1,3,5,4,2,6,8,7来说,序列3,4,8,7 是它的一个子序列。
对于一个长度为n的序列,它一共有2^n 个子序列,有(2^n – 1)个非空子序列。

请注意:子序列不是子集,它和原始序列的元素顺序是相关的。

(2)公共子序列 : 顾名思义,如果序列C既是序列A的子序列,同时也是序列B的子序列,则称它为序列A和序列B的公共子序列。

例如:

对序列 1,3,5,4,2,6,8,7和序列 1,4,8,6,7,5 来说

序列1,8,7是它们的一个公共子序列。

请注意: 空序列是任何两个序列的公共子序列。
例如: 序列1,2,3和序列4,5,6的公共子序列只有空序列。

(3)最长公共子序列

A和B的公共子序列中长度最长的(包含元素最多的)叫做A和B的公共子序列。
仍然用序列1,3,5,4,2,6,8,7和序列1,4,8,6,7,5

它们的最长公共子序列是:

1,4,8,7
1,4,6,7

最长公共子序列的长度是4 。
请注意: 最长公共子序列不唯一。

请大家用集合的观点来理解这些概念,子序列、公共子序列以及最长公共子序列都不唯一,所以我们通常说一个最长公共子序列,但显然最长公共子序列的长度是一定的。

最长公共子序列问题就是求序列A= a1,a2,……an, 和B = b1,b2,……bm,的一个最长公共子序列。

用公式可表示为:
在这里插入图片描述
在这里插入图片描述
因为最长公共子序列不唯一,让我们把问题简化,如何求出两个序列的最长公共子序列长度呢?

首先能我们想到的恐怕是暴力枚举?那我们先来看看:序列A有 2^n 个子序列,序列B有 2^m 个子序列,如果任意两个子序列一一比较,比较的子序列高达 2^(n+m) 对,这还没有算具体比较的复杂度。

或许你说,只有长度相同的子序列才会真正进行比较。那么忽略空序列,我们来看看:对于A长度为1的子序列有C(n,1)个,长度为2的子序列有C(n,2)个,……长度为n的子序列有C(n,n)个。对于B也可以做类似分析,即使只对序列A和序列B长度相同的子序列做比较,那么总的比较次数高达:
C(n,1)*C(m,1)*1 + C(n,2) * C(m,2) * 2+ …+C(n,p) * C(m,p)*p
其中p = min(m, n)。

如此,简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。
为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。

我们先来看看递归法:

public class 递归法实现最大公共子序列 {
	public static int lcs(char[] x, char[] y, int i, int j) {
		if (i == 0 || j == 0) {
			// 当这里(i==0位置的元素)x串为空的时候,没有公共串。
			// 所以我们返回的公共子序列的长度为零。
			// 当我们的这串为空(x==0)的时候,
			// 实际上我们传的的字符串的第0个元素为'A',
			// 而不是空串,所以返回0是不对的。因为'A'在里头比的时候,
			// 可能有公共串,则我们要在两个字符串开头加0号字符。
			return 0;
		} else if (x[i] == y[j]) {
			return lcs(x, y, i - 1, j - 1) + 1;
		}
		return max(lcs(x, y, i - 1, j), lcs(x, y, i, j - 1));
		// 返回x串的第i个元素的第j个串和y串的第i的子串到j-1的串的最大值。
	}

	private static int max(int a, int b) {
		if (a > b) {
			return a;
		}
		return b;
	}

	public static void main(String[] args) {
		String s1 = "ABCBDAB";

		// 创建两个字符数组

		char[] c1 = new char[s1.length() + 1];
		// 字符串s1的长度加个1
		char[] t1 = s1.toCharArray();
		// 字符串可以通过此方法转成字符串数组
		c1[0] = (char) 0;
		// 让c1[0]保存0号字符

		// 遍历s1字符串里的每一个字符
		for (int i = 0; i < t1.length; i++) {
			c1[i + 1] = t1[i];
			// 将数组t1[i]的字符赋到c1[i+1]中
		}

		// 同上
		String s2 = "BDCABA";
		char[] c2 = new char[s1.length() + 1];
		char[] t2 = s2.toCharArray();
		// 字符串可以通过此方法转成字符串数组
		c2[0] = (char) 0;
		for (int i = 0; i < t2.length; i++) {
			c2[i + 1] = t2[i];
		}
		
		System.out.println(lcs(c1, c2, c1.length - 1, c2.length - 1));
	}
}

但是,使用递归法,时间复杂度较大。而由此我们想到了大多新手较为熟悉的备忘录法。

public class 备忘录法查找最大公共子序列 {
	public static int lcs(char[] x, char[] y, int i, int j, int[][] bak
	// *在该括号里初始化bak,则每次初始化成一样的值。
	// * 且每次初始化,原来的值就被覆盖掉了。
	// * 而备忘录是对递归的每一层进行记录。
	) {
		// 那么每一次我没在算第i行j列字符之前的子串时,
		// 我们都可以先判断一下。
		// 而这个公共子串的长度已经被算出来了。
		// 我们在这里只需要判断一下,bak[i][j]!=-1。
		// 如果不是-1,就说明不是初始化的值,就说明有值了。
		// 这时候,我们就把它返回出去就行了。
		//

		if (bak[i][j] != -1) {
			return bak[i][j];
		}
		if (i == 0 || j == 0) {
			bak[i][j] = 0;// 这里需要注意的是,将0赋给bak[i][j]时,并没有返回。
			// 当i==0,j==0的时候,同理将该值存到备忘录里。
		} else if (x[i] == y[j]) {
			bak[i][j] = lcs(x, y, i - 1, j - 1, bak) + 1;
		} else
			bak[i][j] = max(lcs(x, y, i - 1, j, bak), lcs(x, y, i, j - 1, bak));
		// 承接上面没有return,这里就需要加else,
		// 不然该处被执行,bak[i][j]所存的值就会被多减一次。
		return bak[i][j];
		// 从备忘录里返回。
	}

	private static int max(int a, int b) {
		if (a > b) {
			return a;
		}
		return b;
	}

	public static void main(String[] args) {
		String s1 = "ABCBDAB";
		char[] c1 = new char[s1.length() + 1];
		char[] t1 = s1.toCharArray();
		// 字符串可以通过此方法转成字符串数组
		c1[0] = (char) 0;
		for (int i = 0; i < t1.length; i++) {
			c1[i + 1] = t1[i];
		}
		String s2 = "BDCABA";
		char[] c2 = new char[s2.length() + 1];
		char[] t2 = s2.toCharArray();
		// 字符串可以通过此方法转成字符串数组
		c2[0] = (char) 0;
		for (int i = 0; i < t2.length; i++) {
			c2[i + 1] = t2[i];
		}

		// 这里创建了一个备忘录数组
		int[][] bak = new int[c1.length][c2.length];
		// 而这里需要初始化一下bak,因为我们保存在保存字符串的时候,
		// 是有0号字符的值的,而不能默认是该值。
		// 之所以要初始化bak,是因为这个数组里是保存有字符0这个值的。
		// 当i和j都等于0的时候,公共子串就是0。而有这个0值的时候,
		// 就要将其存到备忘录里。那么给bak的默认值为0就不对了,这样容易造成混淆。

		// 那么我们在这里遍历一下
		for (int i = 0; i < c1.length; i++) {
			for (int j = 0; j < c2.length; j++) {
				bak[i][j] = -1;
				// 在这里我们给其初始化为-1,这是数组里没有的值的。
				// 由此可作为判断,并给传进去。当然我们初始化bak的时候,
				// 只能在外边初始化,而不能在里头初始化。
			}
		}
		System.out.println(lcs(c1, c2, c1.length - 1, c2.length - 1, bak));
	}
}

虽然,备忘录法是时间富足度降低,但是这也是在增加空间复杂度的方法下进行的整改。至此,我们还可以想到动态规划中最为高效的方法——字底向上法。

public class 自底向上查找最大公共子序列 {
	public static int lcs(char[] x, char[] y, int i, int j, int[][] bak
	// 这里bak[][]已经不是备忘录了,而是从表中取值的。
	// 而这里bak[][]也不用初始化了。
	) {
		for (int ii = 0; ii <= i; ii++) {
			for (int jj = 0; jj <= j; jj++) {
				// 这里i和j是索引,不是总长度。所以i和j不需要减一。
				if (ii == 0 || jj == 0) {
					bak[ii][jj] = 0;
				} else if (x[ii] == y[jj]) {
					bak[ii][jj] = bak[ii - 1][jj - 1] + 1;
					// 这里就不用递归方法了,
					// 因为该元素之前的元素的值已经求出来了。
					// 然后再在此基础上进行累加。
				} else
					bak[ii][jj] = max(bak[ii - 1][jj], bak[ii][jj - 1]);
			}
		}
		return bak[i][j];
		// 返回最大值
	}

	private static int max(int a, int b) {
		if (a > b) {
			return a;
		}
		return b;
	}

	public static void main(String[] args) {
		String s1 = "ABCBDAB";
		char[] c1 = new char[s1.length() + 1];
		char[] t1 = s1.toCharArray();
		// 字符串可以通过此方法转成字符串数组
		c1[0] = (char) 0;
		for (int i = 0; i < t1.length; i++) {
			c1[i + 1] = t1[i];
		}
		String s2 = "BDCABA";
		char[] c2 = new char[s2.length() + 1];
		char[] t2 = s2.toCharArray();
		// 字符串可以通过此方法转成字符串数组
		c2[0] = (char) 0;
		for (int i = 0; i < t2.length; i++) {
			c2[i + 1] = t2[i];
		}

		// 这里创建了一个备忘录数组
		int[][] bak = new int[c1.length][c2.length];
		// 而这里需要初始化一下bak,因为我们保存在保存字符串的时候,
		// 是有0号字符的值的,而不能默认是该值。
		// 之所以要初始化bak,是因为这个数组里是保存有字符0这个值的。
		// 当i和j都等于0的时候,公共子串就是0。而有这个0值的时候,
		// 就要将其存到备忘录里。那么给bak的默认值为0就不对了,这样容易造成混淆。

		// 那么我们在这里遍历一下
		for (int i = 0; i < c1.length; i++) {
			for (int j = 0; j < c2.length; j++) {
				bak[i][j] = -1;
				// 在这里我们给其初始化为-1,这是数组里没有的值的。
				// 由此可作为判断,并给传进去。当然我们初始化bak的时候,
				// 只能在外边初始化,而不能在里头初始化。
			}
		}
		System.out.println(lcs(c1, c2, c1.length - 1, c2.length - 1, bak));
	}
}

注意: 这里使用了循环计算表格里的元素值,而不是递归,如果使用递归需要已经记录计算过的元素,防止子问题被重复计算。

广东省道路工程检测练习试题(判断题)真题 按下式计算小于某粒径颗粒质量百分数:X=(A/B)x100( )49.、挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测。95.挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测( )107.以干密度 pd 为纵坐标,含水率w为横坐标,绘 pd-w 关系曲线,曲线上峰值点的纵、横坐标分别为最大干密度和最佳含水率( ) 阅读详情

相关推荐

SAP SD实战:用BADI_SLS_HEAD_SCR_CUS给销售订单VA01/VA02加自定义字段(附完整函数组代码)

本文详细解析了在SAP SD模块中如何利用BADI_SLS_HEAD_SCR_CUS实现销售订单(VA01/VA02)的屏幕增强,包括数据结构设计、函数组创建和BADI接口实现。通过实战案例和完整代码,帮助开发者掌握在SAPMV45A标准流程中添加自定义字段的关键技术,提升业务定制化能力。

weixin_27015733的博客 368

[csu/coj 1078]多个序列的最长公共子序列

题意:给n个序列,同一个序列里面元素互不相同,求它们的最长公共子序列。 思路:任取一个序列,对于这个序列里面的两个数ai,aj(i<j),如果对于其它每一个序列,都出现过ai,aj,且ai在aj之前出现,那么i到j连一条长度为1的有向边,完美转化为DAG最长路。需要注意:对于某个数,如果某个序列没出现那么这个点的答案应该为-INF,表示这个点表示的状态不合法。 代码: ...

weixin_30702413的博客 345

第21章 分层架构软件测试

技术人员和客户代表对代码服务相关的技术进行详细的交流,由此确定代码审计的方案(哪些代码要审计、用什么方式审计、审计的时间、审计的要求等)代码审计报告提交和沟通之后,跟开发人员针对代码审查发现的问题进行修改,然后代码审查人员进行回归的检查,然后提交复查的报告;本层不需要了解其它层的实现细节,只需要考虑与本层相关的两层之间的接口和调用的情况。然后对客户要求的功能点进行人工的代码审查,对源代码的扫描结果进行人工的分析和确认;结合自动化扫描的结果和人工审查的结果生成测试对象的代码审查报告,最后提交给客户;

李黏黏的博客 3270

多个串的最长公共子序列

dp补题

qq_54783066的博客 1358

别再为数码管引脚发愁了!用STM32的普通IO口驱动TM1650数码管模块(附完整模拟I2C代码)

本文详细介绍了如何利用STM32的普通IO口通过模拟I2C协议驱动TM1650数码管模块,提供了完整的硬件连接方案和软件实现代码。通过模拟I2C技术,开发者可以灵活使用任意GPIO引脚控制多位数码管显示,解决了传统驱动方式占用大量IO资源的问题。文章包含TM1650寄存器解析、亮度控制等实用功能实现,并分享了常见问题排查与性能优化技巧。

weixin_30764771的博客 657

Unreal5从入门到精通之如何录制360°VR全景视频

摘要:本文详细介绍了使用虚幻引擎(UE)生成360°全景视频的完整流程。首先需启用MovieRender Queue和Panoramic Capture插件,准备场景并设置相机序列。通过影片渲染队列选择8K分辨率输出PNG序列帧,利用ffmpeg工具转换为MP4格式,最终获得高精度全景视频。该方法适用于VR内容开发,能以较低性能消耗实现影院级画质,特别适合冥想类应用场景。教程涵盖从插件配置到后期合成的全链路操作,为开发者提供高效的全景内容生产解决方案。(150字)

TxNet 1401

java 最长公共子序列 详解

java 最长公共子序列 详解

T_Y_F_的博客 1475

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5583

如何找到所有最长公共子序列集合

如何找到所有最长公共子序列集合 1. 问题描述: 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切的说,若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…k有zj=xij 例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标...

留住这时光的博客 3018

MeloTTS 生成 RKNN 模型

摘要: 本方案基于RK3588平台,利用RKNN工具链实现高效语音合成(TTS)。采用MeloTTS开源模型,支持中英文混合语音生成。部署流程包括:1) 导出ONNX模型;2) 转换为RKNN格式;3) 在RK3588开发板运行。关键步骤包含环境配置(RKNN Toolkit2≥1.4.0)、模型转换(非量化处理)及音频处理实现。方案充分发挥RK3588的NPU加速能力,适用于边缘设备语音合成场景

J。 346

【RT-DETR涨点改进】损失函数改进篇 | RT-DETR引入SlideLoss损失函数,适合目标检测中面临的尺度变化、遮挡以及难易样本不平衡等复杂场景下的检测任务,含详细使用步骤

本文提出在RT-DETR目标检测模型中引入SlideLoss损失函数,以解决尺度变化、遮挡和难易样本不平衡等问题。SlideLoss通过自适应阈值划分正负样本,并对难样本赋予更高权重,使模型更关注分类边界样本。文章详细展示了SlideLoss的核心代码实现,并逐步指导如何在RT-DETR框架中集成该损失函数。实验表明,该方法能有效提升模型性能,特别适用于复杂场景下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 262

java-5 道经典算法题

通过定义状态数组 `dp` 并逐步计算子问题的解,可以高效地解决这个问题。由于我们只需要当前和前一个状态的值,因此可以使用两个变量而不是整个数组来保存状态,从而将空间复杂度降低到 O(1)。为了降低空间复杂度,可以使用滚动数组技术,只保存最近两行的状态,从而将空间复杂度从 O(m * n) 降低到 O(n)。为了进一步优化,可以考虑在每次递归时避免不必要的交换操作,并通过标记数组来记录哪些字符已经被使用,避免重复计算。使用动态规划的思路,可以进一步优化为只使用两个变量保存最近的两个结果,降低空间复杂度。

weixin_41247813的博客 1276

腾讯滑块验证码防水墙 tdc.js 补环境实录

腾讯滑块验证码破解研究摘要 本文记录了破解腾讯防水墙滑块验证码(tdc.js)的全过程。研究重点包括: 流程分析:通过抓包分析验证码完整链路,识别出关键参数collect和eks需从tdc.js虚拟机获取 环境模拟:采用渐进式补环境方法,针对字节码虚拟机特性构建完整的window对象,包括navigator、screen、canvas等API的精确模拟 核心破解:成功调用TDC.getData()和TDC.getInfo()获取关键参数,解决POW计算和滑块缺口识别问题 优化调整:针对errorCode 5

码王吴彦祖的博客 224

最大子序列、最长公共子串、最长公共子序列

最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是{5,-3,4,2},它的和是8,达到最大;而{5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。

starstarstone的专栏 394

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 常用算法详解:从二分查找到最小生成树

本文摘要: 本文系统讲解14类常用算法的Java实现,包括查找、排序、动态规划等经典算法。主要内容包括: 算法复杂度分析:介绍时间/空间复杂度的概念和常见级别,提供算法速查表。 二分查找:详细讲解标准查找和边界查找两种实现,强调排序前提条件。 排序算法:涵盖冒泡排序、插入排序等7种排序,分析各自的复杂度、稳定性和适用场景。 算法实现特点: 使用Java 8+语法 每个算法都是独立可运行的类 包含核心思想说明和复杂度分析 指出常见错误和注意事项 文章强调算法学习的核心是理解原理而非死记模板,注重算法选择和数据

qq_29029209的博客 222

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

常见十四种的Java算法

一、简单列出常见的Java中14种算法 序号 简称 英文名称 简介 1 二分查找 Binary Search 二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 2 冒泡排序 Bubble Sort 3 插入排序 4 快速排序 5 希尔排序 6 归并排序 7 桶排序 8 基数排序

心有谦谦结 4万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java最大公共子序列

题目:求两个字符串的最大公共子序列 这里子序列和子串需要区分一下,子序列不需要字符串里元素紧挨着,但子串要求前后元素紧挨,这里求子序列可以用递归法来做 代码如下: public class MaxComSub { public static int f(String s1,String s2) { if(s1.length()==0 || s2.length()==0) return 0; if(s1.charAt(0)==s2.charAt(0)) { return f(s1.substr

z2598849479的博客 274

算法刷题-2025年02月19日

BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("C:\\Users\\yzh\\Desktop\\算法刷题\\algorithmBrush\\src\\compareToTest\\input.txt"));"C:\\Users\\yzh\\Desktop\\算法刷题\\algorithmBrush\\src\\compareToTest\\randomOutput.txt",

qq_50709355的博客 735

java 递归求求两个串的最大公共子序列的长度

// 求两个串的最大公共子序列的长度 public class Main { public static int f(String s1, String s2) { if (s1.length()==0 || s2.length()==0) return 0; if (s1.charAt(0) == s2.charAt(0)) { return f(s1.substring(...

xckkcxxck的博客 782

动态规划之查找最大公共子序列

动态规划 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,...

weixin_43403215的博客 986

求最大公共子序列问题

问题描述: 给定两个字符串s1和s2;输出它们的最大公共子序列。 子序列和子数组不同,子数组是连续的;而子序列不要求是连续的,只要前后顺序关系一致就行。 例如: 输入: AB34C A1BC2 输出: ABC 输入: 3563243 513141 输出: 534 解法一: 用递归的解法,遍历其中一个字符串,对其中的每一个字母在另一个字符串中找相同。找到后把剩余的字符串进行下一轮的递归。即在双层循环...

覃会程的博客 1390

【Java】用动态规划的方法查找最长公共子序列

最长公共子序列的概念 LCS是(Longest Common Subsequence)的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。 比如,对于char x[]="aabcd";有顺序且相互相邻的aabc是其子序列,有顺序但是不相邻的abc也是其公共子序列。即,只要得出序列中各个元素属于所给出的数列,就是子序列。 再加上ch...

JockLiu的博客 1296

最长公共子序列和最长公共子串的动态规划实现(java)

最长公共子序列和最长公共子串的动态规划算法实现,java代码以及个人见解。

晓茸有点甜的博客 7063

LCS最大公共子序列O(nlogn)算法

最长公共子序列问题: 给定2个字符串,求其最长公共子串。如abcde和dbada的最长公共字串为bd。 动态规划:dp[i][j]表示A串前i个和B串前j个的最长公共子串的长度。 则 若A[i] == B[j] , dp[i][j] = dp[i-1][j-1] + 1; 否则 dp[i][j] = max(dp[i-1][j],dp[i][j-1]); 时间复杂度O(N*M)。 d

qq_33901573的博客 449

蓝桥杯 ADV-202 最长公共子序列 java

问题描述 问题描述   给定两个字符串,寻找这两个字串之间的最长公共子序列。 输入格式   输入两行,分别包含一个字符串,仅含有小写字母。 输出格式   最长公共子序列的长度。 样例输入 abcdgh aedfhb 样例输出 3 样例说明   最长公共子序列为a,d,h。 数据规模和约定   字串长度1~1000。 解题思路 分析: 1.只需建立一个长宽为两个字符串长度+1的二维数组 2.dp[i][j]表示String a的前i个字符构成的字符串和String b的前j个字符构成的字符串这两者

⭐君子以自强不息 384

最长公共子序列(动态规划)

1.最长公共子序列(不连续) 是指从给定序列中随意去掉一些字符后形成的子序列。(随意的意思是可以不连续的去掉一些个,也可以一个不去) 比如对于下面两个序列 a:abcbdb b:acbbabdbb 它们的最长公共子序列:acbdb,长度5。 采用动态规划求解,定义F[ i, j ]为(a0,a1,...ai−1a_0,a_1,...a_{i-1}a0​,a1​,...ai−1​)和(b0,b1,...bj−1b_0,b_1,...b_{j-1}b0​,b1​,...bj−1​)的最长公共子序列长度。 因此根

atwdy的博客 1471
上一篇: 【JAVA】字符串练习1
下一篇: 【JAVA】字符串的构建、替换,子串的提取,Pattern对象、Matcher对象和find方法
寻爻青年
博客等级 码龄8年 27粉丝 137原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻爻青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值