代码随想录训练营第56天| ● 583. 两个字符串的删除操作 ● 72. 编辑距离

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

题目链接:https://leetcode.com/problems/delete-operation-for-two-strings

解法:

  1. 确定dp数组(dp table)以及下标的含义

dpij:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。

  1. 确定递推公式
  • 当word1i - 1 与 word2j - 1相同的时候
  • 当word1i - 1 与 word2j - 1不相同的时候

当word1i - 1 与 word2j - 1相同的时候,dpij = dpi - 1j - 1;

当word1i - 1 与 word2j - 1不相同的时候,有三种情况:

情况一:删word1i - 1,最少操作次数为dpi - 1j + 1

情况二:删word2j - 1,最少操作次数为dpij - 1 + 1

情况三:同时删word1i - 1和word2j - 1,操作的最少次数为dpi - 1j - 1 + 2。但这种情况其实可以归并到前两种情况的其中一种,或者说前两中情况又可以由这种情况得到,所以不用单独写了。

于是不相等时,dpij = min(dpij-1 + dpi-1j) + 1

边界条件:无

时间复杂度:O(n * m)

空间复杂度:O(n * m)

python 复制代码
class Solution(object):
    def minDistance(self, word1, word2):
        dp = [[0] * (len(word2)+1) for i 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:
                    # 可由word1或者word2删除1个元素递推得到
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1
        return dp[-1][-1]

72. 编辑距离

题目链接:https://leetcode.com/problems/edit-distance/

解法:

  1. dp数组和下标的含义

dpij 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dpij。

  1. 递推公式

word1i-1 != word2j-1时,三种操作:

以 word1 为 "horse",word2 为 "ros",且 dp53 为例,即要将 word1的前 5 个字符转换为 word2的前 3 个字符,也就是将 horse 转换为 ros,因此有:

(1) dpi-1j-1,即先将 word1 的前 4 个字符 hors 转换为 word2 的前 2 个字符 ro,然后将第五个字符 word14(因为下标基数以 0 开始) 由 e 替换为 s(即替换为 word2 的第三个字符,word22)

(2) dpij-1,即先将 word1 的前 5 个字符 horse 转换为 word2 的前 2 个字符 ro,然后在末尾补充一个 s,即插入操作

(3) dpi-1j,即先将 word1 的前 4 个字符 hors 转换为 word2 的前 3 个字符 ros,然后删除 word1 的第 5 个字符

所以插入和删除的操作都是针对word1去做的。

边界条件:无

时间复杂度:O(mn)

空间复杂度:O(mn)

python 复制代码
class Solution(object):
    def minDistance(self, word1, word2):
        dp = [[0] * (len(word2)+1) for i 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-1][j], dp[i][j-1])+1
        return dp[-1][-1]
相关推荐
GoAI12 分钟前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi42 分钟前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M3 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen4 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷6 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方6 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん7 小时前
【C++】哈希表
c++·算法·散列表
码少女7 小时前
数据结构——图的基础
数据结构
地平线开发者7 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
Severus_black9 小时前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list