0583-两个字符串的删除

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

示例:

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

提示:

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

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

参考:

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<len(dp);i++ {
		dp[i] = make([]int, len(word2)+1)
	}
	// 初始化
	for i:=0;i<len(dp);i++ {
		dp[i][0] = i
	}
	for j:=0;j<len(dp[0]);j++ {
		dp[0][j] = j
	}
	for i:=1;i<len(dp);i++ {
		for j:=1;j<len(dp[i]);j++ {
			if word1[i-1] == word2[j-1] {
				dp[i][j] = dp[i-1][j-1]
			} else {
				dp[i][j] = min(min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+2)
			}
		}
	}
	return dp[len(dp)-1][len(dp[0])-1]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

posted on 2021-12-05 17:06  进击的davis  阅读(30)  评论(0编辑  收藏  举报

导航