Leetcode-583 两个字符串的删除操作

Leetcode-583 两个字符串的删除操作

  • 题目

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

    示例:

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

  • 解题思路

    两个字符串删除后字符串相同,意思同子长公共子序列一致,因此我们可以直接通过动态规划求出最长公共子序列s,则最少的步数为res=len(word1)-len(s)+len(word2)-len(s)

    求最长公共子序列:

    通过dp矩阵存储最长公共子序列的长度,dp[i][j]代表word1[0:i]word2[0:j]的最长公共子序列的长度,此时:

    当word1[i]==word2[j]时,dp[i][j]=dp[i-1][j-1]+1

    例子:

    'sea'、'ea',word1[2]=word[2],所以此时的最长公共子序列长度dp[i][j]='se'和'e'的最长公共子序列长度+1

    当word1[i]!=word2[j]时,dp[i][j]=max(dp[i][j-1],dp[i-1][j]

    例子:

    'sea'、'eat',word1[2]!=word2[2],此时dp[2][2]就是在'sea','ea'的最长公共子序列长度和'se'、'eat'的最长公共子序列的最大值

  • 代码实现

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        len1=len(word1)
        len2=len(word2)
        dp=[[0 for i in range(len2+1)] for j in range(len1+1)]
        for i in range(1,len1+1):
            for j in range(1,len2+1):
                if word1[i-1]==word2[j-1]:
                    dp[i][j]=dp[i-1][j-1]+1
                else:
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])
        return len1+len2-2*dp[-1][-1]
posted @ 2021-09-25 10:31  流光之中  阅读(67)  评论(0编辑  收藏  举报