java最长升序子序列
最长升序子序列是最长公共子序列的变形。
只要将字符串升序排序后与原字符串求最长公共子序列即可。
以下提供一个工具类可以传入任何形式的数组。(添加新类型的数组时构造方法要自己加)。
package com.leejuen.string; import java.lang.reflect.Array; import java.util.Arrays; public class LCS { private Integer len; private Object str1; private Object str2; LCS(String a,String b) { str1 = a.toCharArray(); str2 = b.toCharArray(); } LCS(char[] a,char[] b) { str1 = a; str2 = b; } LCS(int[] a,int[] b) { str1 = a; str2 = b; } public int getLCS() { if(len==null) ini(); return len; } private void ini() { int str1_len = Array.getLength(str1); int str2_len = Array.getLength(str2); int[][] dp = new int[str1_len+1][str2_len+1]; //初始化dp,java默认数据为0所以不用赋值 for(int i=1;i<=str1_len;i++) { for(int j=1;j<=str2_len;j++) { Object tmp1 = Array.get(str1, i-1); Object tmp2 = Array.get(str2, j-1); if(tmp1.equals(tmp2)) { dp[i][j] = dp[i-1][j-1]+1; } else { dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]); } } } len = dp[str1_len][str2_len]; } //一下是测试:打印4、5 /*public static void main(String[] args) { //经典最长公共子序列 String a = "BDCABA"; String b = "ABCBDAB"; System.out.println(new LCS(a,b).getLCS()); //最长升序子序列 int[] cc1 = {3,1,5,6,2,7,9}; int[] cc2 = Arrays.copyOf(cc1, cc1.length); Arrays.sort(cc2); System.out.println(new LCS(cc1,cc2).getLCS()); }*/ }