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

583 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

583.两个字符串的删除操作

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/de…

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

示例:

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

提示:

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

解法

  • 最长公共子序列: 找到最长的公共子序列后,两个字符串的长度相加再减去最长公共子序列的长度就是要变化的次数
class Solution(object):
    def minDistance(self, word1, word2):
        m, n = len(word1), len(word2)
        dp = [[0] * (n + 1) for _ in range(m + 1)]  # dp表示
        for i in range(1, m + 1):
            for j in range(1, n + 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])
        
        lcs = dp[m][n]
        return m - lcs + n - lcs

复杂度分析

  • 时间复杂度:O(mn),其中 m和 n 分别是字符串 word1和word 2的长度。二维数组 dp 有 m+1 行和 n+1 列,需要对 dp 中的每个元素进行计算。

  • 空间复杂度:O(mn), 创建了m+1 行 n+1 列的二维数组 dp