java最长升序子序列

来源:互联网 发布:湖北省知行学院 编辑:程序博客网 时间:2024/05/17 09:01

最长升序子序列是最长公共子序列的变形。

只要将字符串升序排序后与原字符串求最长公共子序列即可。

以下提供一个工具类可以传入任何形式的数组。(添加新类型的数组时构造方法要自己加)。

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());}*/}


0 0
原创粉丝点击