首页 > 其他分享 >第九章 动态规划Part12

第九章 动态规划Part12

时间:2024-08-30 13:03:15浏览次数:9  
标签:删除 Part12 len 第九章 range word1 word2 动态 dp

目录

任务

115. 不同的子序列

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 + 7 取模。

思路

dp[i][j]表示s[0:i)中出现以t[0,j)的次数
每次拓展一个字符,求次数,直到拓展完成,分为两种情况

  • 当当前字符相等时,即s[i-1] == t[j-1] 时,次数等于两种情况相加,一种是用s[i-1]来匹配这个字符,即之前满足条件的次数;第二种是不用s[i-1]来匹配这个字符,满足条件的次数
  • 当当前字符不等时,次数等于s去掉这个字符,满足条件的次数
    注意初始化的情况
class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        #dp[i][j] 表示s[0:i)中出现以t[0,j)的次数
        dp = [[0] * (len(t)+1) for _ in range(len(s)+1)]
        
        for j in range(len(t)+1): #初始化第一行(s为空的情况)
            dp[0][j] = 0
        for i in range(len(s)+1): #初始化第一列(t为空的情况)
            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[len(s)][len(t)]

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

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

思路

dp[i][j] 表示只是用删除操作使得word1[0:i)中word2[0,j)相同的最小次数
每次拓展一个字符,求次数,直到拓展完成,分为两种情况

  • 当当前字符相等时,即s[i-1] == t[j-1] 时,不需要删除,操作数不变,即次数延续拓展字符之前的情况
  • 当当前字符不等时,有三种情况处理,第一种是删除word1中的元素,第二种情况是删除word2中的元素,第三种情况是同时删除word1,word2中的元素,求这三种情况的最小值即可,实际上,可以忽略第三种情况,因为它可以由前两种情况推导得到
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        #dp[i][j] 表示只是用删除操作使得word1[0:i)中word2[0,j)相同的最小次数
         dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]
         
         for j in range(len(word2)+1): #初始化第一行,即word1为空的情况
             dp[0][j] = j
         for i in range(len(word1)+1):
             dp[i][0] = i
             
         
         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, # 当前删除word1[i-1],所以操作的最小次数为使得word1[0:i-1)中word2[0,j)相同的最小次数加上这次删除(1次)的总次数
                                   dp[i][j-1] + 1, # 当前删除word2[i-1]
                                   #dp[i-1][j-1] + 2 # 同时删除word1[i-1],word2[i-1],实际可以不需要,因为可以从前两步推导出来
                                  )
         return dp[len(word1)][len(word2)]

72. 编辑距离

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符

思路

由于插入和删除是镜像操作(删除word1中的元素相当于添加word2中的元素),所以只考虑删除。类比583. 两个字符串的删除操作

  • 当前字符相等时,操作数不变
  • 当前字符不同时,有三种情况(删除两种,替换一种),前两种同583. 两个字符串的删除操作,并且隐含同时删除的情况。第三种替换,即将当前的字符替换,为之前的情况(dp[i-1]dp[j-1])增加一次即可
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        #dp[i][j] 表示用删除,添加,替换操作使得word1[0:i)中word2[0,j)相同的最小次数
         dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]
         
         for j in range(len(word2)+1): #初始化第一行,即word1为空的情况
             dp[0][j] = j
         for i in range(len(word1)+1):
             dp[i][0] = i
             
         
         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, # 当前删除word1[i-1],相当于在word2中添加
                                   dp[i][j-1] + 1, # 当前删除word2[i-1],相当于在word1中添加
                                   dp[i-1][j-1] + 1 # 由于当前元素不同,替换当前元素,让word1[i-1] == word2[j-1]
                                  )
         return dp[len(word1)][len(word2)]

标签:删除,Part12,len,第九章,range,word1,word2,动态,dp
From: https://www.cnblogs.com/haohaoscnblogs/p/18388556

相关文章

  • JS动态引入模块
    这是静态引入,importxxfrom‘xxx’;这是动态引入,import('xxx')动态引入是一个异步操作,即它会返回一个Promise对象,因此我们可以捕获引入失败的异常。具体运用场景:路由由后端动态生成,前端根据获取到的路由动态生成菜单,并根据对应路由去找到对应的组件进行跳转。譬如路由为/hom......
  • 实现一个动态评论系统:Vue3与后端API交互
    在当今的开发环境中,评论系统是多种应用中不可或缺的一部分,本文将带您深入了解如何使用Vue3实现一个动态评论系统,并与后端API进行交互。我们将重点使用Vue3的compositionAPI(setup语法糖)来构建这个系统。需求概述在构建动态评论系统时,我们需要实现以下功能:获取评论......
  • openGauss-动态数据脱敏机制
    openGauss-动态数据脱敏机制可获得性本特性自openGauss1.1.0版本开始引入。特性简介数据脱敏是行之有效的数据库隐私保护方案之一,可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术,可以有效......
  • 神经网络释放GPU显存两种方式(固定or动态)
    固定的批次数后释放显存固定的批次数后释放显存,比如每训练100批次释放一次显存,可以通过在训练循环中添加一个计数器来实现。以下是如何实现这种策略的示例代码:importtorchdeftrain():start_epoch=0end_epoch=100release_frequency=100#每100个批次......
  • 动态规划——数字三角形模型
    数字三角形模型母题:数字三角形思路​ 集合f[i][j]表示所有从起点走到(i,j)的路径​ 属性f[i][j]存的数是集合中所有路径和的最大值​ 状态计算:对于每一条从起点到(i,j)的路径,其要么是从左上方来的,要么是从右上方来的。#include<bits/stdc++.h>#define......
  • 第九章 动态规划Part11
    目录任务1143.最长公共子序列思路1035.不相交的线思路53.最大子数组和思路392.判断子序列思路任务1143.最长公共子序列给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回0。一个字符串的子序列是指这样一个新的字......
  • 第九章 动态规划Part10
    目录任务300.最长递增子序列思路674.最长连续递增序列思路718.最长重复子数组思路任务300.最长递增子序列子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列思路dp[i]表示以索引i结尾的最......
  • 【零信任方案】持续安全风险评估与动态访问控制实现方案
    一、为什么做持续安全风险评估与动态访问控制二、实现方案思路三、详细实现方案原创网络个人修炼一、为什么要持续进行安全风险评估和动态的访问控制访问控制是比较常见的安全隔离技术,我们这里主要讲网络访问的访问控制,其他文件存储读取访问等其他访问也是类似。传统......
  • 算法-动态规划-完全背包
    0.动态规划五部曲:确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组1.完全背包问题完全背包问题中,每个物品都有无数个,可以重复选择。二维dp数组int[][]dp=newint[n][totalWeight+1];for(inti=0;i<n;++i){fo......
  • Cesium展示——图标 billboard 动态变化
    文章目录需求分析1.导入2.加载billboard3.点击图标展示对应name属性4.实现动态变化4.上代码需求Cesium展示——图标动态变化分析1.导入importspjkfrom'./assets/spjk.png';2.加载billboardfunctionaddBillboard(lon......