最长公共子序列

看了会动态规划的问题,简单运用下:

求解Lcs问题:

package programing.artist;

import java.util.ArrayList;
import java.util.List;

public class Lcs {
	/**
	 * 最长公共子串(Longest CommonSubstring)和
	 * 最长公共子序列(LongestCommon Subsequence, LCS)
	 * 什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,
	 * 且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。
	 * 举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,
	 * 则它们的最长公共子序列便是:4 5 5。
	 */
	public static String getLcs(String a,int abegin,int aend,String b,int bbegin,int bend){ // 最长公共子序列  不是子串
		if(abegin>=aend||bbegin>=bend){
			return "";  //""的length =0
		}
		if(a.charAt(abegin)==b.charAt(bbegin)){
			return a.charAt(abegin)+getLcs(a,abegin+1,aend,b,bbegin+1,bend);
		}else{
			String s1=getLcs(a,abegin,aend,b,bbegin+1,bend);
			String s2=getLcs(a,abegin+1,aend,b,bbegin,bend);
			return s1.length()>s2.length()?s1:s2;
		}
		
	}
	public static void main(String[] args){ //
		String a="13455";
		String b="245576";
		System.out.println(getLcs(a, 0, a.length(), b, 0, b.length()));
		int[] ac={1,3,4,5,5};
		int[] bc={2,4,5,5,7,6};
		List<Integer> res = getLcs(ac,0,bc,0,new ArrayList<Integer>());
		System.out.println(res.size());
		for(Integer i:res){
			System.out.print(i+",");
		}
	}
	public static List<Integer> getLcs(int[] a,int ab,int[] b,int bb,List<Integer> res){  //最长公共子序列    数组的实现
		if(ab>=a.length||bb>=b.length){
			return res;
		}
		if(a[ab]==b[bb]){
			res.add(a[ab]);
			return getLcs(a,ab+1,b,bb+1,res);
		}else{
			List<Integer> r1 = getLcs(a, ab+1, b, bb, new ArrayList<Integer>());
			List<Integer> r2 = getLcs(a, ab, b, bb+1, new ArrayList<Integer>());
			if(r1.size()>r2.size())
				return res.addAll(r1)?res:res;
			else
				return res.addAll(r2)?res:res;
		}
	}

}
输出结果:
455
3
4,5,5,

这篇blog的文字说明很好懂:http://blog.csdn.net/byrsongqq/article/details/6307698


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值