zoukankan      html  css  js  c++  java
  • 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());
    	}*/
    }
    



  • 相关阅读:
    jquery笔记
    mysql优化三
    MYSQL优化
    mysql大表优化
    mybatis缓存机制
    mybatis主键返回语句 使用方法,就是实体类.getid即可拿到返回的id
    mybatis组合实体查询
    HTTP Status 500
    Perfmon——为什么“% Disk Time”计数器的值会大于100%?
    Lint——Android SDK提供的静态代码扫描工具
  • 原文地址:https://www.cnblogs.com/leejuen/p/5547461.html
Copyright © 2011-2022 走看看