0583-两个字符串的删除


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

示例:

输入: "sea", "eat"
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"

提示:

给定单词的长度不超过500。
给定单词中的字符只含有小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-operation-for-two-strings

参考:

  • https://leetcode-cn.com/problems/delete-operation-for-two-strings/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-dpzi-8cai1/

python

# 0583-两个字符串的删除

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        """
        动态规划, 参考115
        1.dp定义
        - dp[i][j]:以i-1为结尾的字符串word1,
            和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数
        2.递推
        - 当word1[i - 1] 与 word2[j - 1]相同的时候
            - dp[i][j] = dp[i - 1][j - 1]
        - 当word1[i - 1] 与 word2[j - 1]不相同的时候
            情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1
            情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1
            情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2
            那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1})
        3.初始化
        - dp[i][0] = i
        - dp[0][j] = j
        :param word1:
        :param word2:
        :return:
        """
        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]+2, dp[i-1][j]+1, dp[i][j-1]+1)
        return dp[-1][-1]

golang

package dynamicPrograming

// 动态规划
func minDistance(word1, word2 string) int {
	dp := make([][]int, len(word1)+1)
	for i:=0;i