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());
	}*/
}
时间: 2024-08-29 06:04:25

java最长升序子序列的相关文章

最长升序子序列

Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14. Input The first line of the input contains an inte

(hdu step 3.2.4)FatMouse&#39;s Speed(在第一关键字升序的情况下,根据第二关键字来求最长下降子序列)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1034 Accepted Submission(s): 526   Proble

最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已经做了实现,但是这种方法时间复杂度太高,查阅相关资料后我发现有人提出的算法可以将时间复杂度降低为O(nlogn),这种算法的核心思想就是替换(二分法替换),以下为我对这中算法的理解: 假设随机生成的一个具有10个元素的数组arrayIn[1-10]如[2, 3, 3, 4, 7, 3, 1, 6,

poj 2757 : 最长上升子序列(JAVA)

总时间限制:  2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等.这

最长公共子串、最长公共子序列的Java实现与NLP应用

前言以前HanLP使用"最短编辑距离"来做推荐器,效果有待提高,主要缺点是根据拼音序列的编辑距离推荐的时候,同音字交错很常见,而编辑距离却不那么大.这时我就在寻求一种补充的评分算法,去评判两个句子在拼音这一维度上的相似程度.区别最长公共子串(Longest Common Substring)指的是两个字符串中的最长公共子串,要求子串一定连续.最长公共子序列(Longest Common Substring)指的是两个字符串中的最长公共子串,不要求子串连续.求解两者的求解与编辑距离一样,

数组中最长的升序子序列(动态规划问题)

The longest Increasing Subsequence (LIS)  给定一个序列,找到这个序列的一个最长的子序列,使得子序列的所有元素是升序的,且元素之间的相对位置不变(元素可以在原数组中不相邻,但是相对位置不变) 比如, LIS for { 10, 22, 9, 33, 21, 50, 41, 60, 80 } 是 6,LIS 是 {10, 22, 33, 50, 60, 80}. 分析 arr[0-n-1]是输入,然后L(i)是到元素i为止 LIS 的长度,也就是arr[i]

LeetCode 300. Longest Increasing Subsequence最长上升子序列 (C++/Java)

题目: Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4. Note: There may be

LeetCode 673. Number of Longest Increasing Subsequence 最长递增子序列的个数 (C++/Java)

题目: Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: Input: [1,3,5,4,7] Output: 2 Explanation: The two longest increasing subsequence are [1, 3, 4, 7] and [1, 3, 5, 7]. Example 2: Input: [2,2,2,2,2] O

leetcode 673. 最长递增子序列的个数 java

题目: 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7].示例 2: 输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5.注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数. 解题: 方法:动态规划 假设对于以 nums[i] 结尾的序列,我们知道最长序列的长度 le