1. 程式人生 > >動態規劃實現最長公共子序列

動態規劃實現最長公共子序列

 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 = new
char[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 }