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')

解題思路

顯然本題需要使用動態規劃,窮舉法是無法完成的。所謂動態規劃說白了就是複雜的問題基於簡單的問題。針對本
題,如果是兩個字母a和b,顯然編輯距離是1,做個替換就行。現在用dp[idx1][idx2]代表word1[0...idx1-1]和
word2[0...idx2-1]之間的編輯距離。當word1[idx1]等於word2[idx2]時,
dp[idx1+1][idx2+1] = dp[idx1][idx2]。當word1[idx1]不等於word2[idx2]時,需要採用刪除、添加、替換三個動
作使兩者變的相同,條件是編輯距離最小。如果是替換,則dp[idx1+1][idx2+1] = dp[idx1][idx2]+1;如果是刪除
dp[idx1+1][idx2+1] = dp[idx1-1][idx2]+1;如果是添加,dp[idx1+1][idx2+1] = dp[idx1][idx2-1],這個地方需要稍微動點腦筋,對word1添加一個字母相當於對word1啥也沒幹,把word2刪掉相應的一個字母.最後比較
哪個編輯距離最小。筆者感覺本題初看起來覺得很難,思路清晰後代碼非常容易。

代碼

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        len1 = len(word1)
        len2 = len(word2)

        pd = [ [0] * (len2+1) for i in range( (len1+1) )]
        for i in range(len1 +1):
            pd[i][0] = i
        for j in range(len2 +1):
            pd[0][j] = j

        for i in range(len1):
            idx1 = i+1
            for j in range(len2):
                idx2 = j+1
                if( word1[i] == word2[j] ):
                    pd[idx1][idx2] = pd[idx1-1][idx2-1]
                else :
                    pd[idx1][idx2] = 1 + min(
                        pd[idx1][idx2-1],       #刪除
                        pd[idx1-1][idx2],       #插入
                        pd[idx1-1][idx2-1],     #替換
                        )
                    
        return pd[len1][len2]

在這裏插入圖片描述
本文如果對你有用,請筆者喝一瓶水。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章