給定兩個單詞 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')
動態規劃的思想,和前面不同路徑的題目類似。設想用dp二維陣列儲存word1的前 i 個字元和word2的前 j 個字元達成匹配的步數。
邊界條件:dp[i][0]=0:m,dp[0][j]=0:n,其中,m和n分別表示word1和word2的字元數。
狀態轉移方程是:
如果word[i]==word[j],則當前達到匹配的步數dp[i+1][j+1]=dp[i][j]
如果word[i]
如果是新增操作,則先統計word1的前 i 個字元匹配word2的前 j+1 個字元(因為word1添了乙個字元)的方法數。即add=dp[i][j+1];
如果是刪除操作,則先統計word1的前 i +1個字元匹配word2的前 j 個字元(因為word1刪了乙個字元)的方法數。即delete=dp[i+1][j];
如果是替換操作,則統計word1的前 i 個字元匹配word2的前 j 個字元的方法數。即replace=dp[i][j];
最後,dp[i+1][j+1]=min(add,delete,replace)+1
class solution:
def mindistance(self, word1, word2):
""":type word1: str
:type word2: str
:rtype: int
"""m = len(word1)
n = len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
dp[i][0] = i
for i in range(n + 1):
dp[0][i] = i
for i in range(m):
for j in range(n):
if word1[i] == word2[j]:
dp[i + 1][j + 1] = dp[i][j]
else:
add = dp[i][j + 1]
delete = dp[i + 1][j]
replace = dp[i][j]
dp[i + 1][j + 1] = min(add, delete, replace) + 1
return dp[m][n]
72 編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3解釋 horse rorse 將 h 替換為 r r...
72 編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...
72 編輯距離
題目 給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為...