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



  • 相关阅读:
    Linux 在当前文件夹下查找某文件
    Linux 计算文件夹下内容大小【包含软链接的文件】
    《什么是生物信息学》摘录
    二分查找算法
    python之递归函数
    python之内置函数、匿名函数
    python之迭代器,生成器
    Python之文件操作
    基础数据类型的整理
    Python数据可视化—折线图
  • 原文地址:https://www.cnblogs.com/leejuen/p/5547461.html
Copyright © 2011-2022 走看看