代码随想录 Day - 56|#583 两个字符串的删除操作|#72 编辑距离

清单

● 583. 两个字符串的删除操作
● 72. 编辑距离

LeetCode #583 两个字符串的删除操作

1. 题目

给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

2. 思路

  1. dp数组的含义: 使word1[i-1]和word2[j-1]相同所需的最小步数
  2. 递推公式:
  • word [i-1] == word2[j-1], dp[i][j] = dp[i-1][j-1]
  • word [i-1] != word2[j-1] --> 3种情况
    1. word1 删除一个字符,word1 [i-1] = word2 [j] --> dp[i][j] = dp[i-1][j] + 1
    1. word2 删除一个字符, word 2[j-1] = word1[i] --> dp[i][j] = dp[i][j-1] + 1
    1. word1 & word2 同时删除一个字符串, dp[i][j] = dp[i-1][j-1] + 2
  1. 初始化 ----> dp[i][0] = i dp[0][j] = j
  2. 遍历顺序: 从上到下 从左往右

3. 代码实现

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        #Initial dp
        dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]

        for i in range(len(word1)+1):
            dp[i][0] = i
        for j in range(len(word2)+1):
            dp[0][j] = j

        for i in range(1, len(word1) + 1):
            for j in range(1, len(word2) + 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] + 1, dp[i-1][j-1] + 2)

        return dp[-1][-1]

LeetCode #72 编辑距离

1. 题目

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数。
你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

2. 思路

  1. dp数组的含义: 使word1[i-1]和word2[j-1]相同所需的最小步数
  2. 递推公式:
  • word [i-1] == word2[j-1], dp[i][j] = dp[i-1][j-1]
  • word [i-1] != word2[j-1] --> 3种情况
    1. word1 删除一个字符,word1 [i-1] = word2 [j] --> dp[i][j] = dp[i-1][j] + 1
    1. word2 删除一个字符, word 2[j-1] = word1[i] --> dp[i][j] = dp[i][j-1] + 1
    1. 替换一个字符串, dp[i][j] = dp[i-1][j-1] + 1
  1. 初始化 ----> dp[i][0] = i dp[0][j] = j
  2. 遍历顺序: 从上到下 从左往右

3. 代码实现

#Initial dp
        dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]

        for i in range(len(word1)+1):
            dp[i][0] = i
        for j in range(len(word2)+1):
            dp[0][j] = j

        for i in range(1, len(word1) + 1):
            for j in range(1, len(word2) + 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] + 1, dp[i-1][j-1] + 1)

        return dp[-1][-1]

你可能感兴趣的:(leetcode,算法,python)