動態規劃實現最長公共子序列
阿新 • • 發佈:2018-11-30
1 public class Test2 { 2 3 static int[][] result; 4 static String str1 = "ABCBDAB"; 5 static String str2 = "BDCABA"; 6 static char[][] b; 7 public static void main(String[] args) { 8 9 result = new int[str1.length()+1][str2.length()+1]; 10 b = newchar[str1.length() + 1][str2.length() + 1]; 11 LCS(str1, str2); 12 for (int i = 0; i < str1.length()+1; i++) { 13 for (int j = 0; j < str2.length()+1; j++) { 14 System.out.print(result[i][j] + " "); 15 } 16 System.out.println();17 } 18 System.out.println("最大公共子序列的長度為:" + result[str1.length()][str2.length()]); 19 System.out.println("最大公共子序列為:"); 20 print_LCS(str1.length(), str2.length()); 21 } 22 23 /** 24 * 求出最大公共子序列的長度 並記錄構造表資訊 25 * @param str1 26 * @param str2 27*/ 28 static void LCS(String str1, String str2) { 29 /* 30 * 初始化二位陣列的邊界 31 */ 32 for (int i = 0; i <= str1.length(); i++) { 33 result[i][0] = 0; 34 } 35 for (int i = 0; i <= str2.length(); i++) { 36 result[0][i] = 0; 37 } 38 for (int i = 1; i <= str1.length(); i++) { 39 for (int j = 1; j <= str2.length(); j++) { 40 if(str1.charAt(i - 1) == str2.charAt(j - 1)) { 41 result[i][j] = result[i - 1][j - 1] + 1; 42 b[i][j] = '↖'; 43 } else if(result[i - 1][j] >= result[i][j-1]) { 44 result[i][j] = result[i - 1][j]; 45 b[i][j] = '↑'; 46 } else { 47 result[i][j] = result[i][j - 1]; 48 b[i][j] = '←'; 49 } 50 } 51 } 52 } 53 54 /** 55 * 列印構造表資訊 56 * @param i 57 * @param j 58 */ 59 static void print_LCS(int i, int j) { 60 if(i == 0 || j == 0) { 61 return; 62 } 63 if(b[i][j] == '↖') { 64 print_LCS(i-1, j-1); 65 System.out.print(str1.charAt(i-1)); 66 } else if(b[i][j] == '↑') { 67 print_LCS(i-1, j); 68 } else { 69 print_LCS(i, j-1); 70 } 71 } 72 }