LCS问题
分为递归和动态规划两种求解方法。
//递归求解 private static int lcs(String one,String two){ int n = 0; int m = 0; int length = 0; while(one.length()!= 0 && two.length()!= 0){ n = one.length() ; m = two.length() ; if (one.substring(n -1).equals(two.substring(m -1))) { String temp = one.substring(one.length()-1); one = one.substring(0, one.length() - 1); two = two.substring(0, two.length() - 1); return lcs(one, two) + 1; }else{ return lcs(one,two.substring(0,two.length()-1))>lcs(one.substring(0,one.length()-1),two) ?lcs(one,two.substring(0,two.length()-1)):lcs(one.substring(0,one.length()-1),two); } } return length; }
-----------------------------------------------------------------------------------
//动态规划(遍历) 求解 private static int lcser(char[] one,char[] two){ int a = one.length; int b = two.length; int [][] arras = new int[a+1][b+1]; for (int i=0;i<arras[0].length;i++){ arras[0][i] = 0; } for (int j=0;j<arras.length;j++){ arras[j][0] = 0; } for (int n=1;n <= b ;n++){ for (int i=1;i <= a;i++){ if (one[i-1] == two[n-1]){ arras[i][n] = arras[i-1][n-1] +1; }else{ arras[i][n] = Math.max(arras[i-1][n],arras[i][n-1]); } } } for (int i= 0;i<= b;i++){ System.out.println("/n"); for (int j= 0; j<= a;j++){ System.out.print(arras[j][i] + " "); } } return arras[a][b]; }