DP-LeetCode72. 編輯距離

1、題目描述

給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少操作數 。

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

  1. 插入一個字符
  2. 刪除一個字符
  3. 替換一個字符

2、代碼詳解

自底向上

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        n1 = len(word1)
        n2 = len(word2)
        dp = [[0] * (n2 + 1) for _ in range(n1 + 1)]
        # 第一行
        for j in range(1, n2 + 1):
            dp[0][j] = dp[0][j-1] + 1
        # 第一列
        for i in range(1, n1 + 1):
            dp[i][0] = dp[i-1][0] + 1
        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] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1
        #print(dp)
        return dp[-1][-1]
word1 = 'horse'
word2 = 'ros'
s = Solution()
print(s.minDistance(word1, word2))  # 3

dp[i][j] 代表 word1 到 i 位置轉換成 word2 到 j 位置需要最少步數

即第一個字符串前 i 個字符,通過編輯,變成第二個字符串的前 j 個字符的最少操作次數

所以,

  • 當 word1[i] == word2[j]dp[i][j] = dp[i-1][j-1]
  • 當 word1[i] != word2[j]dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1

其中,

  • dp[i-1][j-1] 表示替換操作
  • dp[i-1][j] 表示刪除操作
  • dp[i][j-1] 表示插入操作

注意,針對第一行,第一列要單獨考慮,我們引入 '' 下圖所示:

第一行,是 word1 爲空變成 word2 最少步數,就是插入操作

第一列,是 word2 爲空,需要的最少步數,就是刪除操作

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