当前位置: 首页 > news >正文

leetcode刷题-动态规划12

代码随想录动态规划part12|115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

    • 115.不同的子序列 -- 递推公式略难理解
    • 583. 两个字符串的删除操作
    • 72. 编辑距离
    • 编辑距离总结篇

115.不同的子序列 – 递推公式略难理解

leetcode题目链接
代码随想录文档讲解

思路

s中有多少种删除字符串的方式使之变为t

  1. dp数组定义,dp[i][j]: (i-1) 为结尾的s与 j-1为结尾的t的个数

  2. 递推公式
    if(s[i-1]=t[j-1]) dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
    else dp[i][j] = dp[i-1][j] 注意:这里是dp[i-1][j],不是j-1
    如果两个元素相等,可以使用这个元素也可以不使用s中的这个元素
    如果不相同,就要删除s中这个元素再进行计算
    在这里插入图片描述

  3. 初始化: dp[i][0] = 1(s不空,t为空), dp[0][j] = 0 (s为空),dp[0][0] = 1

  4. 遍历顺序
    从左到右,从上到下

python代码

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        if len(s) < len(t):
            return 0
        dp = [[0]*(len(t)+1) for _ in range(len(s)+1)]
        for i in range(len(s)+1):
            dp[i][0] = 1
        for i in range(1, len(s)+1):
            for j in range(1, len(t)+1):
                if s[i-1] == t[j-1]:
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j]
        return dp[-1][-1]   

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

leetcode题目链接
代码随想录文档讲解

思路

本题递推公式较为好像,但第一次提交初始化出错未通过
初始化注意:dp[i][0] = i;dp[0][j] = j

python代码

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        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]
class Solution(object):
    def minDistance(self, word1, word2):
        m, n = len(word1), len(word2)
        
        # dp 求解两字符串最长公共子序列
        dp = [[0] * (n+1) for _ in range(m+1)]
        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])
                    
        # 删去最长公共子序列以外元素
        return m + n - 2 * dp[-1][-1]

72. 编辑距离

leetcode题目链接
代码随想录文档讲解

思路

  1. dp数组定义
    dp[i][j] 以i-1为结尾的word1和以j-1为结尾的word2最少操作次数

  2. 递推公式
    两种情况:if dp[i-1] == dp[j-1]: dp[i][j] = dp[i-1][j-1] 不需要修改元素
    else: dp[i][j] = min(dp[i-1][j] +1, dp[i][j-1]+1, dp[i-1][j-1]+1) (删除元素和添加元素是逆向操作,操作次数一致,只需要考虑一种即可)(替换一个元素,使word1中这个元素和word2中这个元素相同)

  3. 初始化
    dp[i][0] = i 和 dp[0][j] = j 注意

  4. 遍历顺序
    从前往后,从左往右

python代码

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        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], dp[i-1][j], dp[i][j-1]) + 1
        return dp[-1][-1]  

编辑距离总结篇

代码随想录文档讲解

相关文章:

  • (链表)206. 反转链表
  • Winfrom基础知识41-60
  • GolangTCP通信解决粘包问题
  • TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文
  • Nping- Nmap中的一个工具-用于生成网络数据包并分析响应
  • 跳跃游戏 (leetcode 55
  • u8g2原理解析
  • Java中Math.random()的用法
  • 2025-03-15 学习记录--C/C++-PTA 练习3-4 统计字符
  • Java创造型模式之原型模式详解
  • 《基於Python的网络爬虫抓包技术研究与应用》
  • 基于“动手学强化学习”的知识点(一):第 14 章 SAC 算法(gym版本 >= 0.26)
  • 基本的WinDbg调试指令
  • SEO优先级矩阵:有限资源下的ROI最大化决策模型
  • 科技快讯 | “垃圾短信”可以被识别了;阿里正式推出AI旗舰应用;OpenAI深夜发布全新Agent工具
  • python数据分析文件夹篇--pandas,openpyxl,xlwings三种方法批量创建、 复制、删除工作表
  • JAVA中的多态性以及它在实际编程中的作用
  • 1141. 【贪心算法】排队打水
  • 【2025最新版】如何将fnm与node.js安装在D盘?【保姆级安装及人性话理解教程】
  • git submodule
  • 媒体评教师拎起学生威胁要扔下三楼:师风师德不能“悬空”
  • 浙江一教师被指殴打并威胁小学生,教育局通报涉事人被行拘
  • 人民日报和音:相信中国就是相信明天
  • 以色列媒体:哈马斯愿意释放部分人员换取两个月停火
  • 下辖各区密集“联手”,南京在下一盘什么样的棋?
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药