标签:wls mvm odk elk mdm hmm tag vlc bcb
1 LCS(x,y,i,j) 2 if x[i] = y[j] 3 then C[i,j] ← LCS(x,y,i-1,j-1)+1 4 else C[i,j] ← max{LCS(x,y,i-1,j),LCS(x,y,i,j-1)} 5 return C[i,j]
为了在求解过程中不进行重复计算,用一个二维数组来暂时存储已经计算过的值,牺牲空间来获得时间上的优化。
1 public class LCS { 2 public static int[][] vals ; 3 4 public static int getLCS(String str1,String str2){ 5 int len1 = str1.length(); 6 int len2 = str2.length(); 7 8 vals = new int[len1+1][len2+1]; 9 10 for(int i=0;i<len1;i++){ 11 // 二维数组从[1][1]开始进行有效存储 12 int fi = i+1; 13 for(int j=0;j<len2;j++){ 14 int fj = j+1; 15 //字符相同 16 if(str1.charAt(i) == str2.charAt(j)){ 17 // 满足第一种状况 18 vals[fi][fj] = vals[fi-1][fj-1] + 1; 19 //字符不相同 20 }else if(str1.charAt(i) != str2.charAt(j)){ 21 //满足第二种状况 22 vals[fi][fj] = Math.max(vals[fi-1][fj],vals[fi][fj-1]); 23 } 24 } 25 } 26 27 for(int i=0;i<len1;i++){ 28 System.out.println(Arrays.toString(vals[i])); 29 } 30 31 return vals[len1][len2]; 32 } 34 public static void main(String[] args) { 36 String str1 = "ABCBDAB"; 37 String str2 = "BDCABA"; 38 System.out.println(getLCS(str1,str2)); 41 } 42 }
输出结果:
[0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 1, 1, 1] [0, 1, 1, 1, 1, 2, 2] [0, 1, 1, 2, 2, 2, 2] [0, 1, 1, 2, 2, 3, 3] [0, 1, 2, 2, 2, 3, 3] [0, 1, 2, 2, 3, 3, 4] 4
标签:wls mvm odk elk mdm hmm tag vlc bcb
原文地址:http://www.cnblogs.com/moongeek/p/7530730.html