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

news2024/11/25 22:38:43

 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/2124877.html

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

相关文章

vs2019成功连接数据库mysql

②在vs2019中创建新项目,注意x64 ③ 右击项目打开属性 ④添加include路径 ⑤添加lib路径 点击确定后点击应用 ⑥ 点击全部确定 ⑦ ⑧启动mysql 进入数据库: 在数据库中创建student的表 ⑨在va2019中输入下面代码测试 注意:密码换成自己…

大数据Flink(一百一十六):Flink SQL的时间属性

文章目录 Flink SQL的时间属性 一、Flink 三种时间属性简介 二、Flink 三种时间属性的应用场景 三、​​​​​​​SQL 指定时间属性的两种方式 四、​​​​​​​​​​​​​​SQL 处理时间DDL定义 五、​​​​​​​​​​​​​​SQL 事件时间DDL定义 Flink SQL的时…

Nature子刊|C4平台助力单细胞多组学分析,揭秘睾丸生殖细胞瘤的分子特征

在精准医疗的大潮中,单细胞多组学技术正成为研究肿瘤微环境的强有力工具。最近,一项发表在《Nature Communications》的重磅研究,就利用了包括DNBelab C Series在内的平台设备,对睾丸生殖细胞瘤(Seminoma)进…

矩阵分析 学习笔记3 多项式矩阵 jordan标准型

就是说这个矩阵里面的各个元素都是多项式,多项式的主角是类目大(自变量)。 多项式矩阵的秩是啥呢? 0多项式就是完全0的那种,就一个0,类目大都没有了。 多项式矩阵的秩和带一个类目大进去变成普通矩阵的秩不…

最大间距问题

LeetCode164 最大间距 基数排序 #include <iostream> #include <vector> using namespace std;class Solution { public:int maximumGap(vector<int>& nums) {int nnums.size();if(n<2) return 0;int exp1;int Maxnums[0];vector<int> buf(n)…

WD mybook10T硬盘exfat变0字节恢复方法

WD的mybook系列应该全部是3.5寸台式机机械硬盘然后加了盒子做成了移动存储&#xff0c;单盘容量已经极高了&#xff0c;此类盘出厂的文件系统一般为exfat&#xff08;可能是厂商为了方便mac客户使用&#xff09;。下边这个案例就是我们经常遇到的exfat变0字节。 故障存储:WD m…

用网卡的ap模式抓嵌入式设备的网络包

嵌入式设备不像pc上&#xff0c;有一些专门的工具比如wareshark来抓包&#xff0c;嵌入式设备中&#xff0c;有的可能集成了tcpdump&#xff0c;可以用来进行简单的抓包&#xff0c;但是不方便分析&#xff0c;况且有的嵌入式设备不一定就集成了tcpdump工具。 关于tcpdump工具…

[001-03-007].第07节:Redis中的事务

我的后端学习大纲 我的Redis学习大纲 1、Redis事务是什么&#xff1a; 1.可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c; 按顺序地串行化执行而不会被其他命令插入&#xff0c;不许加塞2.一个队列中&#xff0c;一次性、…

AI+RPA机器人 实现自动调用 kimi 的 AI 对话功能(内附使用教程)

前言 今天尝试写一个用RPA自动调用kimi的AI对话功能。 把这个写好之后&#xff0c;就是后面其他一切AI相关的基础&#xff0c;比如自动用AI写文章啊&#xff0c;比如搭建一个微信AI机器人啊等等&#xff0c; 都能用到今天实现的AI对话功能。 话不多说&#xff0c;直接看思路…

在 Windows 中使用系统文件检查器

DiSM.exe /Online /Cleanup-image /Restorehealth

项目管理方法,方法和框架–初学者指南

项目管理方法&#xff0c;方法和框架–初学者指南 项目可以通过各种方式成功结束。但是&#xff0c;最好&#xff0c;最受欢迎的项目管理方法&#xff0c;方法和框架总是在变化。新概念无时无刻不在出现。所有成功的项目都包含一整套方法&#xff0c;工具和技术。实际上&#x…

基于SpringBoot+Vue+MySQL的考研互助交流平台

系统展示 用户前台界面 管理员后台界面 系统背景 本文设计并实现了一个基于SpringBoot、Vue.js和MySQL的考研互助交流平台。该平台旨在为广大考研学子提供一个集资源共享、学习交流、经验分享、心理辅导等功能于一体的综合性在线社区。通过SpringBoot构建高效稳定的后端服务&am…

Whistle 客户端抓包工具

Whistle 客户端 安装或更新 官网&#xff1a; 关于whistle GitBook (wproxy.org)https://wproxy.org/whistle/ Whistle 客户端目前只支持 Mac 和 Windows 系统&#xff0c;如果需要在 Linux、 Docker、服务端等其它环境使用&#xff0c;可以用命令行版本&#xff1a;GitHub…

汽车免拆诊断案例 | 沃尔沃V40 1.9TD断续工作

故障现象 一辆04款的沃尔沃V40 1.9 TD&#xff0c;发动机代码D4192T3&#xff0c;使用博世EDC15C发动机管理。客户说车子断续工作&#xff0c;怀疑是正时皮带出现问题。卸下上皮带盖&#xff0c;检查发现皮带仍然在原来的位置上并且没有出现松动。起动发动机&#xff0c;车辆能…

1 MATLAB 绘图函数函数: plot

>> t -10:0.001:10; >> x sin(t); >> plot(t,x)

python中,在.之后出现的提示中这些带圈的C代表什么意思?其前面的绿色红箭头和红色标记又代表什么意思?

python中&#xff0c;在.之后出现的提示中这些带圈的C代表什么意思&#xff1f;其前面的绿色红箭头和红色标记又代表什么意思&#xff1f; 在Python中&#xff0c;带圈的"C"通常表示"类"。这意味着在该提示中&#xff0c;你正在与一个类的属性或方法进行交…

【Linux】Linux权限历险记---组和用户的关系

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;Linux权限历险记---组和用户的关系 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题 | 代码训练营…

Java初步

背景 名字 Oak&#xff08;橡树&#xff09;改到一个岛&#xff08;疑似盛产咖啡&#xff09; Java之父 詹姆斯高斯林&#xff08;James Gosling&#xff09; sun公司研发 现在属于Oracle公司 把它称为甲骨文公司 应用 企业级应用开发 重点学习JavaSE&#xff08;Standa…

归并排序/计数排序

1&#xff1a;归并排序 1.1&#xff1a;代码 void _MergeSort(int* arr, int left, int right, int* tmp) {if (left > right){return;}int mid (left right) / 2; _MergeSort(arr, left, mid, tmp); _MergeSort(arr, mid1, right, tmp); int begin1 left…

洗护工厂上门预约下单洗衣洗鞋门店小程序

洗护工厂上门预约下单洗衣洗鞋门店小程序定制; ​ ​用户扫码后在小程序自助下单&#xff0c;可预约上门送取件更便捷的洗衣洗鞋新体验&#xff01; 案例介绍&#xff1a; 为洗衣洗鞋门工厂开发的一个洗鞋用户自己下单的软件&#xff0c;用户在线下单即可上门送取; 洗鞋小程序是…