1. 程式人生 > 實用技巧 >LeetCode 72 編輯距離

LeetCode 72 編輯距離

LeetCode72 編輯距離

題目描述

給你兩個單詞word1 和word2,請你計算出將word1轉換成word2 所使用的最少運算元。

你可以對一個單詞進行如下三種操作:

插入一個字元
刪除一個字元
替換一個字元

樣例

輸入:word1 = "horse", word2 = "ros"
輸出:3
解釋:
horse -> rorse (將 'h' 替換為 'r')
rorse -> rose (刪除 'r')
rose -> ros (刪除 'e')
輸入:word1 = "intention", word2 = "execution"
輸出:5
解釋:
intention -> inention (刪除 't')
inention -> enention (將 'i' 替換為 'e')
enention -> exention (將 'n' 替換為 'x')
exention -> exection (將 'n' 替換為 'c')
exection -> execution (插入 'u')

演算法分析

時間複雜度

\(O(n^{2})\)

Java程式碼

class Solution {
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        String a = " "+word1;
        String b = " "+word2;
        int[][] f = new int[n+10][m+10];

        //若a長度為i,b長度為0,則需要進行i次刪除操作
        for(int i = 1;i <= n;i ++) f[i][0] = i;
        //若a長度為0,b長度為i,則需要進行i次新增操作
        for(int i = 1;i <= m;i ++) f[0][i] = i;

        for(int i = 1;i <= n;i ++){
            for(int j = 1;j <= m;j ++){
                //刪除和新增
                f[i][j] = Math.min(f[i-1][j], f[i][j-1]) + 1;
                //修改
                if(a.charAt(i) == b.charAt(j)){
                    f[i][j] = Math.min(f[i][j], f[i - 1][j - 1]);
                }
                else{
                    f[i][j] = Math.min(f[i][j], f[i - 1][j - 1]+ 1);
                }
            }

            
        }
        return f[n][m];

    }
}