兩個字串之間的最短編輯距離
阿新 • • 發佈:2019-02-07
1.演算法原理
編輯距離(Edit Distance)是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,編輯操作包括增、刪、改操作。例如將kitten一字轉成sitting:sitten (k→s)sittin (e→i)sitting (→g),最短編輯距離為3.跟“最長公共子序列”一樣,我們採用一個二維陣列來儲存字串X和Y當前的位置的最小編輯距離。現有兩個序列X={x1,x2,x3,...xi},Y={y1,y2,y3,....,yi},
設一個C[i,j]: 儲存Xi與Yj的當前最小的LD。
①:當 Xi = Yi 時,則C[i,j]=C[i-1,j-1];
②:當 Xi != Yi 時, 則C[i,j]=Min{C[i-1,j-1],C[i-1,j],C[i,j-1]}+1;
最終我們的C[i,j]一直儲存著最小的LD。
具體過程如下圖所示:
2.Java實現
public static int[][] getLD(String str1, String str2) { int leng1 = str1.length(); int leng2 = str2.length(); int[][] lens = new int[leng1+1][leng2+1]; //首先初始化陣列的第一行和第一列 for(int i=0; i<=leng1; i++) { lens[i][0] = i; } for(int i=0; i<=leng2; i++) { lens[0][i] = i; } //計算陣列其他位置的大小 for(int i=1; i<=leng1; i++) { for(int j=1; j<=leng2; j++) { if(str1.charAt(i-1) == str2.charAt(j-1)) { lens[i][j] = lens[i-1][j-1]; } else { int tmp = Math.min(lens[i][j-1], lens[i-1][j]); lens[i][j] = Math.min(tmp, lens[i-1][j-1]) + 1; } } } return lens; }