看了会动态规划的问题,简单运用下:
求解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