1. 程式人生 > >動態規劃-LeetCode72-編輯距離

動態規劃-LeetCode72-編輯距離

題目

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

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

插入一個字元
刪除一個字元
替換一個字元
示例 1:

輸入: word1 = "horse", word2 = "ros"
輸出: 3
解釋: 
horse -> rorse (將 'h' 替換為 'r')
rorse -> rose (刪除 'r')
rose -> ros (刪除 'e')
示例 2:

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

思路

一般思路無從下手。採用動態規劃。初始化矩陣 int[word1.length()+1][word2.length()+1]。int[i][j]代表word1的i-1之前的字串變為word2的j-1之前的字串所使用的最小運算元。int[word1.length()][word2.length()]即為所求。

1. 初始化m[0][0]=0

2. 初始化m[0][j]、m[i][0]

3. 之後按行初始化m[i][j]

    m[i][j] = min( 左+1,上+1, 左上+0 or 左上+1(根據是否相等) )。

程式碼

class Solution {
    public int minDistance(String word1, String word2) {
        int[][] m=new int[word1.length()+1][word2.length()+1];
        m[0][0]=0;
        for(int i=1;i<word1.length()+1;i++){
            m[i][0]=i;
        }
        for(int i=1;i<word2.length()+1;i++){
            m[0][i]=i;
        }
        
        for(int i=1;i<word1.length()+1;i++){
            for(int j=1;j<word2.length()+1;j++){
                int min=m[i-1][j-1];
                if(word1.charAt(i-1)==word2.charAt(j-1)){
                    
                }else{
                    min++;
                }
               
                min=Math.min(min,Math.min(m[i-1][j]+1,m[i][j-1]+1));
              

                m[i][j]=min;
            }
        }

        return m[word1.length()][word2.length()];
    }
}

關鍵

動態規劃