【java】动态规划----查找最长公共子列

本文探讨如何解决寻找两个序列的最长公共子序列(LCS)问题。以X='ABCBDAB'和Y='BDCABA'为例,最长公共子序列为BCAB。介绍了暴力解法的时间复杂度问题,以及递归方法和动态规划(备忘录法)的思路,强调了动态规划在提高效率方面的作用。
摘要由CSDN通过智能技术生成

**例题:**给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最长公共子序列的长度。

子序列:在给定的这两个母序列中,比如序列BCAB在母串ABCBDAB与BDCABA中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列(Longest Common Subsequence,LCS),顾名思义,是指在所有的子序列中最长的那一个。在上述例子的中,最长公共子序列为BCAB。

求解算法
X串中有n个元素,Y串中有m个元素
1.暴力解法
假设 m<n, 对于母串Y,我们可以暴力找出2的m次方个子序列,然后依次在母串X中匹配,算法的时间复杂度会达到指数级O(n∗2的m次)。显然,暴力求解不太适用于此类问题。
2.递归方法
用递归的思路就是当数组X和Y对应位置字符相同时,直接求解下一个位置;当不同时取两种情况中的较大数值。
代码如下:

在这里插入图片描述

public class 最长公共子序列 {

	public static int lcs(char[] x, char[] y, int i, int j) {

		if (i == 0 || j == 0)
			return 0;
		else if (x[i] == y[j])
			return lcs(x, y, i - 1, j -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值