編輯距離演算法Java實現
阿新 • • 發佈:2018-11-16
/** * 計算編輯距離Edit Distance * if i == 0 且 j == 0,edit(i, j) = 0 * if i == 0 且 j > 0,edit(i, j) = j * if i > 0 且j == 0,edit(i, j) = i * if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + temp }, * 當第word1第i個字元不等於word2的第j個字元時,temp = 1;否則,temp = 0。 * * @param word1 字串1 * @param word2 字串2 * @return 取二位矩陣的最後一個元素的值, 就是minEditDist arr[word1.length][word2.length] */ public int minEditDistance(String word1, String word2) { /** * 判空,word1為空,取Word2的長度,反之,亦然 */ if (word1.length() == 0 || word2.length() == 0) { return word1.length() == 0 ? word2.length() : word1.length(); } //初始化矩陣 int[][] arr = new int[word1.length() + 1][word2.length() + 1]; for (int i = 0; i <= word1.length(); i++) { arr[i][0] = i; } for (int j = 0; j <= word2.length(); j++) { arr[0][j] = j; } /** * 填充矩陣 */ for (int i = 1; i <= word1.length(); i++) { for (int j = 1; j <= word2.length(); j++) { if (word1.charAt(i - 1) == word2.charAt(j - 1)) { //相等時temp為0 arr[i][j] = arr[i - 1][j - 1]; } else { //不相等時,temp為1 int replace = arr[i - 1][j - 1] + 1; int insert = arr[i - 1][j] + 1; int delete = arr[i][j - 1] + 1; int min = Math.min(replace, insert); min = Math.min(min, delete); arr[i][j] = min; } } } for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } return arr[word1.length()][word2.length()]; }