題目描述
給定兩個單詞 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]
本文如果對你有用,請筆者喝一瓶水。