假设:字符串 L长度为n中定义的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。
0<j<i<= n
f(i) 表示 以i结束的最大子序列 长度,c(i)表示第i个字符,
j<i时候f(i)=max(f(j))+1且 c(j)<c(i),则 字符串L中m最大值 就是 max{f(0),f(2),...f(n-1)}
代码如下:
/** * Created by wuss on 2017/8/29. * f(i) 表示 以i结束的最大子序列,c(i)表示第i个字符 */ public class Ls { public static void main(String[] args) { String str ="abklmncdefg"; String str1 ="ababc"; String str2 ="aaa"; System.out.println(maxLs(str)); System.out.println(maxLs(str1)); System.out.println(maxLs(str2)); maxLsInfo(str); maxLsInfo(str1); maxLsInfo(str2); } private static int maxLs(String str){ int max = 0; int [] lenArr = new int[str.length()]; for(int i=0;i<str.length();i++){ lenArr[i] = 1; } for(int i=0;i<str.length();i++){ char ch = str.charAt(i);//c(i) int maxi=1; for(int j=0;j<i;j++){ if(str.charAt(j)< ch && maxi <= lenArr[j]){//在i之前的满足 c(j)<c(i)的max(f(j))+1,j<i maxi = lenArr[j]+1; } } lenArr[i] = maxi; if(max < maxi){ max = maxi; } } return max; } // 输出最长的递增序列 private static void maxLsInfo(String str){ int max = 0; int [] lenArr = new int[str.length()]; String[] strArr = new String[str.length()]; for(int i=0;i<str.length();i++){ lenArr[i] = 1; } strArr[0]=str.charAt(0)+""; for(int i=0;i<str.length();i++){ char ch = str.charAt(i);//c(i) String temStr=""; int maxi=1; for(int j=0;j<i;j++){ if(str.charAt(j)< ch && maxi <= lenArr[j]){//在i之前的满足 c(j)<c(i)的max(f(j))+1,j<i maxi = lenArr[j]+1; temStr = strArr[j]+ch; } } strArr[i]= (temStr.length() == 0 ? String.valueOf(str.charAt(i)) : temStr); lenArr[i] = maxi; if(max < maxi){ max = maxi; } } for(String s : strArr){ if(s.length() == max){ System.out.print(s+"\t"); } } System.out.println(); } }