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

代码随想录算法训练营第五十天| 动态规划12

115. 不同的子序列

但相对于刚讲过 392.判断子序列,本题 就有难度了 ,感受一下本题和 392.判断子序列 的区别。

代码随想录

 dp[i][j]表示以s[i-1]结尾的子序列中,出现以t[j-1]结尾的t的个数
注意初始化时,dp[0][0]的值不要重复初始化,应该为1,空字符串s删除0个元素可以变成空字符串t

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        n1=len(s)
        n2=len(t)
        dp=[[0]*(n2+1) for _ in range(n1+1)]
        for i in range(n1):
            dp[i][0]=1
        for j in range(1,n2):
            dp[0][j]=0
        for i in range(1,n1+1):
            for j in range(1,n2+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. 两个字符串的删除操作

本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。

代码随想录

参照115的思路推导,

1. 注意初始化边界值,需到n1+1和n2+1才能完全覆盖

2. 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

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        n1=len(word1)
        n2=len(word2)
        dp=[[0]*(n2+1) for _ in range(n1+1)]
        for i in range(n1+1):
            dp[i][0]=i
        for j in range(n2+1):
            dp[0][j]=j
        for i in range(1,n1+1):
            for j in range(1,n2+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][j-1]+1,dp[i-1][j-1]+2)
        return dp[-1][-1]

72. 编辑距离

最终我们迎来了编辑距离这道题目,之前安排题目都是为了 编辑距离做铺垫。

代码随想录

如果word1[i - 1]等于word2[j - 1] 那么说明不用任何编辑,dp[i][j] 就应该是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];

如果不相等,此时需要编辑:

1. word1删除一个元素,即 dp[i][j] = dp[i - 1][j] + 1;

2. word1添加一个元素和word2删除一个元素的操作数一样,即 dp[i][j] = dp[i][j - 1] + 1;

3. word1替换一个元素,word1替换word1[i-1]使其与word2[j-1]相同,即p[i][j] = dp[i - 1][j - 1] + 1;

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        n1=len(word1)
        n2=len(word2)
        dp=[[0]*(n2+1) for _ in range(n1+1)]
        for i in range(n1+1):
            dp[i][0]=i
        for j in range(n2+1):
            dp[0][j]=j
        for i in range(1,n1+1):
            for j in range(1,n2+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]
http://www.dtcms.com/a/40333.html

相关文章:

  • centos9之ESXi环境下安装
  • windows设置暂停更新时长
  • <02.26>Leetcode
  • 力扣LeetCode:1472 设计浏览器历史记录
  • 驭势科技9周年:怀揣理想,踏浪前行
  • 《Linux系统编程篇》共享内存(Linux 进程间通信(IPC))——基础篇
  • 在 Vue 组件中,如何确认父组件在 add 模式下传入 value 的情况及其对子组件 getProducts() 方法的触发影响?
  • matlab 七自由度车辆模型轮毂电机驱动电动汽车的振动分析
  • 【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
  • Python Cookbook-2.14 回退输入文件到起点
  • 【Linux】进程优先级 | 进程调度(三)
  • TCP/IP 5层协议簇:物理层
  • 软件工程----敏捷模型
  • 医疗UI的特殊法则:复杂数据可视化的“零错误”设计守则
  • MySQL 存储过程详解
  • 3D线上艺术展览:开启未来艺术观赏新纪元
  • 【 .sdL】具体解析方法思路和步骤
  • AGV入门基础问答
  • threeJs+vue 轻松切换几何体贴图
  • 【JAVA-数据结构】Map和Set
  • 2025-02-26 学习记录--C/C++-C语言 判断字符串S2是否在字符串S1中
  • 编写Redis开机自启动脚本
  • 《CentOS Stream 9 阿里云 yum 源修改:解锁系统更新新速度》
  • Unity百游修炼(3)——Tank_Battle(双人对战)详细制作全流程
  • Vue纷争:DefineProps 的作用是否因为DefineModel而减弱
  • 日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(12):普通(ふつう)形 :变化方式 :日常朋友家人之间对话
  • 基于SpringBoot + Spring AI + Vue的全栈AI对话系统开发全流程解析
  • 使用uniapp内置组件webview消息传递
  • Zookeeper(67) Zookeeper在HBase中的应用是什么?
  • MySQL进阶04-MVCC实现原理