题目描述
单调递增最长子序列
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4-
输入
-
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
- 输出字符串的最长递增子序列的长度 样例输入
-
3 aaa ababc abklmncdefg
样例输出
-
1 3 7
-
第一行一个整数0<n<20,表示有n个字符串要处理
解答
import java.util.Scanner;
/**
* 动规
* @author Administrator
*
*/
public class n017_单调递增最长子序列 {
public static void main(String[] args) {
String[] ss=getInput();
for(String s: ss){
//输出字符串的最长递增子序列的长度
System.out.println(findMax(s));
}
}
/**
* 接收输入
* 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
* @return
*/
public static String[] getInput(){
Scanner scan=new Scanner (System.in);
String[] ss=new String[scan.nextInt()];
for(int i=0;i<ss.length;i++){
ss[i]=scan.next();
}
return ss;
}
/**
* 寻找单调递增最大长度
* @param s
* @return
*/
public static int findMax(String s){
//存放长度
int[] nums=new int[s.length()];
for(int i=0;i<s.length();i++){
int c1=s.charAt(i);
int temp=0;
for(int j=i;j>=0;j--){
if(c1>s.charAt(j)){
if(nums[j]>temp)
temp=nums[j];
}
}
//前面已经包含的最大字符长度加上本身的长度就等于
// 这个字符的最大长度
nums[i]=temp+1;
}
//找到最大长度
int max=0;
for(int i:nums){
if(i>max)
max=i;
}
return max;
}
}
本题已AC