最长公共子序列LCS问题

9 篇文章 0 订阅
7 篇文章 0 订阅

好久没有写博客了,刚才在网上看了清华大学的数据结构公开课,链接:https://www.xuetangx.com 可以注册个账号去听数据结构课程,老师讲的特好。

我的代码是按照老师讲的递归算法给了个java版本的实现(好久都没写c/c++代码了,手头也没有c++的IDE),通过java版本改c++或其他语言的版本也挺容易的。

递归是一种简单解法,刚开始理解会有困难,一个问题如果能简化为一个比原来问题规模小的问题和一个可以解决的问题,最后可以合并这两个问题的解得出原问题的解,那么

这样的一个问题可以用递归的方法来解决。

一个序列A[0,n],一个序列B[0,m]可以分为三种情况来考虑:

(1)、如果n=-1或者是m=-1,那么它们的最长公共子序列是空“”;

(2)、如果A[n]=B[m],那么这个问题其实可以简化为A[0,n-1],B[0,m-1],比如求“hello”与“exlo”的最长公共子序列,其实可以转化为"hell"与"exl"的最大公共子序列,然后再把最后的"o"加上就可以求解出。

(3)、如果A[n]!=B[m],那么可以转化为A[0,n-1)与B[0,m]或者是A[0,n]与[0,m-1),然后求出两者中的最长公共子序列。

清华大学的老师讲的很透彻,我在这表达的不是很清楚,爱学习的同学可以去这个链接:https://www.xuetangx.com 申请个账号,欣赏欣赏名校老师上课的风采。

public static void main(String[] args) {
		String leftSequence = "computer";
		String rightSequence = "cmhjkute";
		String s = recGetLCS(leftSequence, leftSequence.length()-1, 
										rightSequence, rightSequence.length()-1);
		System.out.println("*******");
		System.out.println(s);
		System.out.println("&&&&&&&&");
	}
	
	public static String recGetLCS(String leftSequence, 
										int indexL, String rightSequence, int indexR) {
		if (indexL < 0 || indexR < 0) {
			return "";
		}
		if (leftSequence.charAt(indexL) == rightSequence.charAt(indexR)) {
			String lcs = recGetLCS(leftSequence, indexL-1, rightSequence, indexR-1)
			                                             + leftSequence.charAt(indexL);
			return lcs;
		} else {
			String s1 = recGetLCS(leftSequence, indexL-1, rightSequence, indexR);
			String s2 = recGetLCS(leftSequence, indexL, rightSequence, indexR-1);
			if (s1.length() > s2.length()) {
				return s1;
			} else {
				return s2;
			}
		}
		
	}

下面我们就上代码

下面是运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值