1. 程式人生 > >編輯距離演算法Java實現

編輯距離演算法Java實現

/**
     * 計算編輯距離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()];
    }