LeetCode 72 編輯距離

2021-09-25 12:07:57 字數 1443 閱讀 4435

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

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

插入乙個字元

刪除乙個字元

替換乙個字元

對於字串匹配型別的動態規劃問題,一般用二維陣列dp,dp[i][j]表示的是字串1的前i個字元和字串2的前j個字元之間的匹配關係。

此題中dp[i][j]表示字串1的前i個字元和字串2的前j個字元完全匹配所需的最少運算元。

思路: f[i][j]代表的是前i個字元和前j個字元完全匹配所需的操作次數,當進行了這些操作之後,前i個字元和前j個字元需要達到完全匹配

替換:對於f[i][j] 替換a[i],當進行完這次操作之後,需要前i個字元和前j個字元完全匹配,因此之前要有 : 前i - 1個字元和前j - 1個字元完全匹配,達到這些需要f[i-1][j-1]次操作,因此f[i][j] = f[i-1][j-1] + 1

刪除:對於f[i][j] 刪除a[i],當進行完這次操作之後,需要前i - 1個字元和前j個字元完全匹配,因此之前要有 : 前i - 1個字元和前j個字元完全匹配,達到這些需要f[i-1][j]次操作,f[i][j] = f[i - 1][j] + 1

插入:對於f[i][j] 插入a[i + 1],此時a[i + 1] 應等於 b[j],當進行完這次操作之後,需要前i個字元和前j個字元完全匹配,達到這些需要f[i][j - 1]次操作,因此之前要有 : 前i個字元和前j - 1個字元完全匹配,f[i][j] = f[i][j - 1] + 1

class solution:

def mindistance(self, word1: str, word2: str) -> int:

length1 = len(word1)

length2 = len(word2)

dp = [[0 for i in range(length2+1)] for j in range(length1+1)] #注意要申請夠空間

for i in range(length1+1):

dp[i][0] = i

for j in range(length2+1):

dp[0][j] = j

for i in range(1,length1+1): # 注意這裡從1開始因為0的地方上面已經初始化過了,而且有i-1,j-1不從1開始會陣列越界。

for j in range(1,length2+1):

if word1[i-1] == word2[j-1]:

dp[i][j] = dp[i-1][j-1]

else:

dp[i][j] = min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]) + 1 # 替換、刪除、插入

return dp[length1][length2]

Leetcode 72 編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...

leetcode 72 編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3解釋 horse rorse 將 h 替換為 r r...

LeetCode72 編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r rorse rose 刪除 r rose ...