給定兩個單詞 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')
【困難】
【分析】參考大佬答案。這道題關鍵就是怎麼想。
d[i][j]
記錄word1[0:i]
到word2[0:j]
的最短距離。
當word[i]==word[j]
:dp[i][j]=dp[i-1][j-1]
當word[i]!=word[j]
:dp[i][j]=1+min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])
,
其中,dp[i-1][j]表示插入操作,dp[i-1][j-1]表示替換操作,dp[i][j-1]表示插入操作。
示例,word1 = "horse", word2 = "ros"
:『』r
os『』0
123h
1123
o2212r3
222s
4332e5
443
注1:技巧1. word1→word2要注意行列都要各加乙個" ",具體見**的第1行1列。
注2:
(i-1,j-1) ↘
(i,j-1) ↓
(i-1,j) →(i,j)
class solution(object):
def mindistance(self, word1, word2):
""":type word1: str
:type word2: str
:rtype: int
"""if not word1:
return len(word2)
elif not word2:
return len(word1)
n1,n2=len(word1),len(word2)
dp=[[0 for j in range(n2+1)] for i in range(n1+1)]
#當word1或者word2為空時
for i in range(n1+1):
dp[i][0]=i
for j in range(n2+1):
dp[0][j]=j
#自頂向下 一行一行計算(也可以自左向右一列一列計算)
for i in range(1,n1+1):
for j in range(1,n2+1):
if word1[i-1]==word2[j-1]:
dp[i][j]=dp[i-1][j-1]
else:
dp[i][j]=1+min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])
return dp[n1][n2]
注:自左向右一列一列計算也很簡單,就是將i和j迴圈的位置交換即可。 動態規劃 72 編輯距離
72.編輯距離 題目要求 解題思路 根據動態規劃的步驟 1.定義陣列元素的含義,這裡用到兩個字串,所以應該定義二維陣列 由於我們求的是字串1轉換成字串2所需要的最少次數 當字串1的長度為i,字串2的長度為j,則字串1轉換成字串2所需次數為dp i j 2.找出關係陣列之間的關係式 大部分情況下,dp...
LeetCode動態規劃 72編輯距離
給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 ...
leetcode 72 編輯距離 動態規劃
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3解釋 horse rorse 將 h 替換為 r r...