代码随想录27期|Python|Day51|​动态规划|​115.不同的子序列|​583. 两个字符串的删除操作​|

news2024/11/15 4:23:13

 115. 不同的子序列

本题是在原来匹配子序列的基础上增加了统计所匹配的子序列个数,也就是dp数组的定义和更新公式和原来的有所区别。

1、dp数组的定义

dp[i][j]表示以i-1和j-1为末尾的字符串中,给定字符串s包含目标字符串t的个数。注意这里不是长度。

2、dp数组的更新

(1)当前字符相等,分两种情况:

1.1、不包含当前t[j-1]和s[i-1]字符时,所能够存在的数量dp[i-1][j-1];

1.2、包含当前t[i-1]字符时,但是不包含s[i-1]字符的时候,所能达到的数量(也就是给定字符串还没有走到i-1位置,但是已经包含j-1位置的t的个数)。

dp[i][j] = dp[i-1][j-1] + dp[i-1][j];

(2)当前字符不相等的时候,只能保留1.2描述的内容。

dp[i]][j] = dp[i-1][j];

3、dp数组初始化

分开行和列来看,dp[i][0]表示目标串是空字符串,也就是给定字符串删除全部元素即可,所以全是1;dp[0][j]表示给定字符串是空字符的时候,这时候目标字符串找不到匹配的,所以全是0.

注意,这里需要考虑0,0的情况,也就是空字符串匹配空字符串,结果是1,所以dp[0][0] = 1。

4、确定遍历顺序

本题遍历顺序是按照子串匹配的顺序遍历。外层for循环走给定字符串s(较长的),内层for循环走目标字符串t(较短的)。

class Solution(object):
    def numDistinct(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: int
        """

        dp = [[0] * (len(t) + 1) for _ in range(len(s) + 1)]
        for j in range(len(t) + 1):
            dp[0][j] = 0
        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 int(dp[-1][-1] % (1e10+7))
        return dp[-1][-1]

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

解法一:所需的步数也就是两个字符串分别达到“最大公共子串”所需要的步数。

1、先求出“不连续”包含的最大子串的长度;

2、返回两个字符串的长度和-2*最大子串长度。

OMG活学活用!

class Solution(object):
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        len_1 = len(word1)
        len_2 = len(word2)
        dp = [[0] * (len_2+ 1) for _ in range(len_1 + 1)]

        for i in range(1, len_1+1):
            for j in range(1, len_2+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 len_1 + len_2 - dp[-1][-1] * 2  # 最后返回的值就是两个字符串分别达到“最大公共子串”需要删除的字符个数

解法二:直接用dp指示当前的位置处匹配所需要的最少的步数。

1、dp数组的定义

dp[i][j]表示i-1和j-1位值处的word1和word2,能够匹配到最长字符串所需要删除的字符个数;

2、dp更新

(1)当前字符相等,则保持不变:dp[i][j] = dp[i-1][j-1];

(2)当前字符不相等,则由之前的dp进行推算。这里依然是取两个值,一个是hold word1当前字符,删除word2中的,一个是hold word2中的字符,删除word1的。取最小值然后+1即可。

dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1;

3、初始化

初始化比较刁钻。

需要反向来思考:对于其中一个是空字符串,index = 0,那么此时若需要匹配,则需要另一个字符串在相应的位置删除全部的元素。所以需要两个for来初始化i,j = 0的行列。

        for i in range(len_1+1):dp[i][0] = i
        for j in range(len_2+1):dp[0][j] = j

4、确定遍历顺序

本质还是字符串匹配的遍历,两层for从小到大遍历。 

class Solution(object):
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        len_1 = len(word1)
        len_2 = len(word2)

        # 解法二
        dp = [[0] * (len_2 + 1) for _ in range(len_1 + 1)]

        for i in range(len_1+1):dp[i][0] = i
        for j in range(len_2+1):dp[0][j] = j

        for i in range(1, len_1+1):
            for j in range(1, len_2+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], dp[i][j-1]) + 1
        return dp[-1][-1]

本题的解法1更加推荐,因为和之前“不连续”最大公共子串可以直接复用,实现也比较简单,也不需要控制边界情况或者考虑初始化细节。

72. 编辑距离

 本题是前几个编辑距离的扩充版,考虑了“非连续”“增删换”等不同的操作以及操作之间的合并

1、确定dp数组含义

dp[i][j]表示在i-1、j-1位置处,word1和word2能够达到最小修改步骤的值;

2、确定dp数组的更新公式

(1)当前字符相等,那么无需步骤来修改,hold上一个匹配的dp值即可:dp[i][j] = dp[i-1][j-1];

(2)当前字符不匹配,则需要逐一讨论“增、删、换”三种操作的表达式,最后取最小值+1即可:

2.1删

删除和之前的表达式完全一致,分别hold住两个word当前位置的index,另一个往前回退一个,也就是dp[i-1][j] + 1和dp[i][j] + 1。

2.2增

增加和删除其实是相同的操作,因为在此字符串位置增加,就相当于在另一个字符的位置删掉一个,所以可以和上面的表达式合并。比如“abc”和“ab”在c位置处,可以选择增加一个c在word2,也可以选择在word1删除一个c,两个操作实际上都是在hold住一个,另一个回退的基础上进行更新的。

2.3换

换操作相当于在现在位置上的字符更新为相同值。不妨反过来想:如果当前字符匹配,则hold住两个字符串上一个index所对应的dp的值,那么现在换了一个元素相当于在相等前,增加了一个步骤,所以dp[i][j] = 1+dp[i-1][j-1]。

3、确定初始化

本题和上一题的初始化相同,因为都涉及对于0行、0列元素的调用,具体的初始化是两个for分别遍历整个0行和0列,dp等于对应的index值。

4、确定遍历顺序

由于dp是分别由前一行、前一列推到而来,所以遍历顺序是从小到大,内外两个for循环。

class Solution(object):
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        len_1 = len(word1)
        len_2 = len(word2)

        dp = [[0] * (len_2 + 1) for _ in range(len_1 + 1)]

        for i in range(len_1+1): dp[i][0] = i
        for j in range(len_2+1): dp[0][j] = j

        for i in range(1, len_1 + 1):
            for j in range(1, len_2 + 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], dp[i][j-1], dp[i-1][j-1]) + 1  # 合并后的表达式
        return dp[-1][-1]

Day51完结!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JMeter做接口测试,如何提取登录Cookie

用JMeter进行接口测试时,经常需要通过登录接口提取Cookie才能进行其他业务流程,如果cookie/token是在登录请求的响应报文里,那么可以通过正则表达式直接提取出来,但是如果Cookie不是在响应报文里,还可以怎么提取出来呢…

牛客小白月赛100(下)

ACM中的C题 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include<iostream> using namespace std; int main() {int n;cin>>n;if(n1)cout<<-1;else if(n%20)cout<<n/2;elsecout<<n/21; } 代码思路 一、总体思路 这段代码的目…

第二百二十一节 JPA教程 - JPA按ID查找示例

JPA教程 - JPA按ID查找示例 一旦我们将实体保存到数据库中&#xff0c;我们可以通过使用EntityManager中的find方法来检索它们。 以下代码显示如何使用find方法与实体id。 Person emp em.find(Person.class, 1L);例子 下面的代码来自Person.java。 package cn.w3cschool.…

Spring Boot 部署方案!打包 + Shell 脚本详解

本篇和大家分享的是springboot打包并结合shell脚本命令部署&#xff0c;重点在分享一个shell程序启动工具&#xff0c;希望能便利工作&#xff1b; profiles指定不同环境的配置 maven-assembly-plugin打发布压缩包 分享shenniu_publish.sh程序启动工具 linux上使用shenniu_p…

Telephony VOLTE配置

1、展锐 VOLTE配置 在配置运营商VOLTE业务时&#xff0c;虽然上层Carrierconfig默认配置VOLTE为关闭状态&#xff0c;但是发现只需要Modem侧配置为支持&#xff0c;上层就能够正常显示VOLTE开关。因此调查了一下相关逻辑 相关代码中可以看到只要"gsm.sys.sim.volte.allowe…

Enscape 4.1.0.2321 安装教程

软件介绍 Enscape 是专门为建筑、规划、景观及室内设计师打造的渲染产品&#xff0c;无需导入导出文件&#xff0c;在常用的软件内部即可看到逼真的渲染效果。 你无需了解记忆各种参数的用法&#xff0c;一切都是傻瓜式的一键渲染&#xff0c;你可以把精力更多地投入到设计中…

极限编程XP例题

答案&#xff1a;D 解析&#xff1a; 结对编程&#xff0c;一个人写代码&#xff0c;一个人看&#xff0c;由于是两个或两个以上的人负责&#xff0c;因此选项A 支持共同代码拥有和共同对系统负责是正确的 选项B 由于是一个人写一个人看&#xff0c;变相实现了代码审查 选项…

AI基础 L16 Logic Agents I

What is an Agent? • The main point about agents is they are autonomous: capable of acting independently, exhibiting control over their internal state • Thus: an agent is a computer system capable of autonomous action in some environment in order to mee…

网络编程(TCP通信)

【1】认识网络 网络&#xff1a;多设备通信 【2】IP地址 1.基本概念 IP地址是Internet中主机的标识Internet中的主机要与别的机器通信必须具有一个IP地址IP地址为32位&#xff08;IPv4&#xff09;或者128位&#xff08;IPv6&#xff09; NAT&#xff1a;公网转私网、私网转公网…

小样本目标定位:Few-shot Object Localization

论文&#xff1a;Few-shot Object Localization 代码&#xff1a;https://github.com/Ryh1218/FSOL 核心贡献&#xff1a; 1. 本文首次定义了小样本目标定位任务&#xff0c;为在标注数据有限的场景下进行目标定位提出了新的研究方向&#xff0c;并建立了高性能的基准。2. 提…

【详解!】什么是端点安全,端点安全策略如何设置?30秒带你了解端点安全!

端点&#xff0c;即接入网络的任何设备&#xff0c;如个人电脑、笔记本电脑、智能手机、平板电脑、服务器以及物联网(IoT)设备等&#xff0c;都是网络安全的潜在风险点。 端点安全&#xff0c;正是针对这些设备所采取的一系列安全措施&#xff0c;旨在保护它们免受恶意软件、未…

CSS【详解】图片相关样式(含object-fit ,object-position,lip-path,filter)

img 渲染图片&#xff0c;可以理解为一张镂空的白纸&#xff0c;通过镂空区域看到白纸下的图片。 图片尺寸 即镂空区域的大小 若未指定&#xff0c;则按图片原始尺寸显示&#xff1b;若指定&#xff0c;则默认按指定尺寸显示&#xff08;若指定尺寸的宽高比与原始的宽高比不同…

【虚拟化】KVM-virsh离线工具进行客户机虚拟机磁盘访问

目录 一、简介 二、常用离线命令 三、具体使用实例 1.virt-inspector 2.virt-cat 3.virt-edit 4.virt-df 5.virt-copy-out/virt-copy-in 6.guestmount 7.virt-diff 8.virt-customize 9.virt-sparsify 一、简介 Red Hat Enterprise Linux 7 提供多个 libguestfs 工具…

Leetcode 最长连续序列

算法流程&#xff1a; 哈希集合去重&#xff1a; 通过将数组中的所有元素放入 unordered_set&#xff0c;自动去除重复元素。集合的查找操作是 O(1)&#xff0c;这为后续的快速查找提供了保证。 遍历数组&#xff1a; 遍历数组中的每一个元素。对于每个元素&#xff0c;首先检…

OpenCV 与 YoloV3的结合使用:目标实时跟踪

目录 代码分析 1. YOLO 模型加载 2. 视频加载与初始化 3. 视频帧处理 4. 物体检测 5. 处理检测结果 6. 边界框和类别显示 7. 帧率&#xff08;FPS&#xff09;计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO&#xff08…

C++之函数的分文件编写

1.创建test.h的头文件 2.创建test.cpp的源文件 3.在头文件中写函数的声明 4.在源文件中写函数的定义 调用测试&#xff1a;

优雅的实现SSL证书的免费申请和续期【FreeSSL】

在今年上半年&#xff0c;各大厂商纷纷调整了免费SSL证书的有效期&#xff0c;将其从12个月缩短至3个月。这一变动给那些管理大量免费证书的人带来了很多麻烦&#xff0c;因为需要频繁地进行申请和部署。 今天我要介绍的是一种自动化申请证书的流程&#xff0c;可以实现多域名…

Python进阶——使用python操作数据库!

Python进阶——使用python操作数据库 一、数据库编程接口 为了对数据库进行统一操作&#xff0c;大多数语言都提供了简单的、标准的数据库接口python database api 2.0中&#xff0c;定义了python数据库api接口的各个部分&#xff0c;如模块接口、连接对象、游标对象、类型对…

物联网——DMA+AD多通道

DMA简介 存储器映像 某些数据在运行时不会发生变化&#xff0c;则设置为常量&#xff0c;存在Flash存储器中&#xff0c;节省运行内存的空间 DMA结构图 DMA访问权限高于cpu 结构要素 软件触发源&#xff1a;存储器到存储器传输完成后&#xff0c;计数器清零 硬件触发源&…

人员随机分组

如何实现男女比例平均分组&#xff1f; 在团队活动中&#xff0c;合理地将人员分组是一项重要的组织工作&#xff0c;它有助于提高团队合作的效率和质量。云分组小程序提供了一个便捷的解决方案&#xff0c;通过智能算法帮助用户快速实现人员分组。本文将详细介绍如何使用云分组…