1. 程式人生 > >動態規劃之longest common subsequence最大公共子序列

動態規劃之longest common subsequence最大公共子序列

這題相對於longest common substring而言更容易一些,區別就子序列和子串, 串的話每個字母是要連續的,序列的話,不要求,用動態規劃做,遞推公式如下,不難:

上程式碼:

public class CommonSubseq {
	public static void main(String[] args){
		String strA = "BDCABA";
		String strB = "ABCBDAB";
		System.out.println(longestSubseq(strA, strB));
	}
	public static String longestSubseq(String str1, String str2){
		return innerLongestSubseq(str1, str2, str1.length()-1, str2.length()-1);
	}
	public static String innerLongestSubseq(String str1, String str2, int i , int j){
		if(str1==null || str2==null){
			return null;
		}
		if(i==-1 || j==-1){
			return "";
		}else{
			if(str1.charAt(i)==str2.charAt(j)){
				return innerLongestSubseq(str1, str2, i-1, j-1)+str1.charAt(i);
			}else{
				String ts1 = innerLongestSubseq(str1, str2, i-1, j);
				String ts2 = innerLongestSubseq(str1, str2, i, j-1);
				if(ts1.length()>ts2.length()){
					return ts1;
				}else{
					return ts2;
				}
			}
		}
	}
}