代码随想录算法训练营day45| 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离

news/2024/11/13 22:24:06/文章来源:https://www.cnblogs.com/tristan241001/p/18544960

学习资料:https://programmercarl.com/0115.不同的子序列.html#算法公开课

动态规划系列之编辑距离问题

学习记录:
115.不同的子序列(当遇到相同字母时,可以选择也可以不选;刚开始没看懂;dp[i][j]是对应i-1结尾和j-1结尾,这样的目的是方便第一行和第一列初始化)

点击查看代码
class Solution(object):def numDistinct(self, s, t):""":type s: str:type t: str:rtype: int"""# 动态规划解法# dp[i][j]表示以j-1为结尾的t片段和以i-1为结尾的s片段,前者作为后者的子序列的情况数量dp = [[0]*(len(t)+1) for _ in range(len(s)+1)]# 初始化 dp[i][0], dp[0][j], dp[0][0]for i in range(len(s)):dp[i][0] = 1     # j-1=-1,那此时t片段是空字符串,这个就是t片段的子序列# 特别的,这里设定了,dp[0][0] = 1,下面要避开for j in range(1, len(t)+1):dp[0][j] = 0      # i-1 =-1,那此时t片段不为空,而s片段是空字符串,那肯定不是后者的子序列# 开始遍历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.两个字符串的删除操作(遇到不同字母就要删除,可以从左上角也可以从左边或者上边执行删除操作;解法二:找公共子序列,根据两字符串长度和公共子序列长度,计算最少操作数)

点击查看代码
class Solution(object):def minDistance(self, word1, word2):""":type word1: str:type word2: str:rtype: int"""# 解法一:当word1的某个字符和word2某个字符不同时,可以删除其中一个;最终删除个数就是最小步数# 动态规划,dp[i][j]代表要使得word1的前i-1和word2的前j-1相同,要删除的最小步数# 构造二维dp数组dp = [[0]*(len(word2)+1) for _ in range(len(word1)+1)]# 初始化for i in range(len(word1)+1):dp[i][0] = i      # 相当于要一个i-1为结尾的word1片段与空字符串一样,那就得删除从0到i-1就是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:# 不同,就要删除一次;比如i-1,j-1的可以从左边i,j-1删除i-1这个元素dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+2)return dp[-1][-1]# 解法二:找到word1和word2的公共子序列,最小步数=len(word1)+len(word2)-len(公共子序列)  # 好像是?# (略)

72.编辑距离(当两字母一样,则操作上等于左上角;若两字母不同,可能执行插入、删除或者替换,这几个就是在左上角或者左边或者上边的基础上加一)

点击查看代码
class Solution(object):def minDistance(self, word1, word2):""":type word1: str:type word2: str:rtype: int"""# 用简单例子来说明插入、删除和替换# eg1. ab和a,可以前者删除b,也可以后者添加a# eg2. ab和ac,就用替换,两者中任意一个替换最后一个字母# 动态规划二维dp数组,dp[i][j]代表word1的前i-1段和word2的前j-1段要达到相同需要的最小操作数# 构造dp数组dp = [[0]*(len(word2)+1) for _ in range(len(word1)+1)]# 初始化dp数组的第一行第一列for i in range(len(word1)+1):dp[i][0] = i     # word1的前i-1段删除所有字母将等于后者空字符串for j in range(1, 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][j-1]+1, dp[i-1][j-1]+1)return dp[-1][-1]

PS:循序渐进,能一点一点理解了,卡尔这排序牛啊
今天阴转多云,开心,吃了大盘鸡、醉鸡、干锅蛙,今天太丰盛了,家里柚子又长虫眼可惜咯

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx_基础

Nginx_基础 Nginx 基础一、Nginx 简介1.1 简介1.2 正向代理和反向代理 二、基本命令 三、配置格式3.1 基本配置格式3.2 时间和空间单位3.3 官方配置模板 四、部署静态网站4.1 增加配置4.2 检查配置4.3 重载配置 五、实现负载均衡5.1 部署后台服务5.2 负载均衡配置5.3 负载均衡策…

【Unity】对TMPAsset打包记录

TMPAsset中对于SourceFontFile引用,不会打包到AssetBundle中

4G核心网学习之4G EPS 中的 PDN Connection

PDN PDN(Packet Data Network分组数据网络),严格意义上讲可以分为内部 PDN 和外部 PDN:内部 PDN 即 EPS 系统中的分组数据网络,是 EPS 系统实体(e.g. MME、HSS、SGW、PGW、PCRF)之间的网络通信;而外部 PDN 即 EPS 系统之外的分组数据网络,例如:3GPP 网络 CDMA1X、Int…

spring初始学习

开始学习了容器 bean 依赖注入 Spring框架是一个开源的Java平台,它提供了全面的基础设施支持,以便你可以更容易地开发Java应用程序。以下是Spring框架中关于容器、Bean和依赖注入的一些基础知识点:Spring容器(Spring Container) Spring容器是Spring框架的核心,负责实例化…

sherpa-onnx:跨平台、多语言的语音处理工具包

Sherpa-onnx 是一个基于 ONNX 运行时的开源语音处理库,支持多种语音相关任务,包括语音识别、语音合成、说话人识别、语言识别等。它不仅支持多种编程语言(如 C++、C、Python、JavaScript、Java、C# 等),还支持多种操作系统和硬件平台(如 Windows、macOS、Linux、Android、…

基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR

1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印):设置SNR=40db将数据导入matlab显示星座图:设置SNR=35db将数据导入matlab显示星座图:仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要1024QAM是一种高级调制方式,可以携带更多的信息位(10…

Hive的分区和排序

一、Hive的分区(十分重要) 1、分区是什么 答:我们可以把一个大的文件分隔成一个个小的文件,这样每次操作一个小文件就很方便了 2、为什么要进行分区 答:通过分区,当我们查询的时候,可以只扫描与条件相关的分区,这样做,避免了全局扫描,加快查询速度 1、静态分区(SP) 静…

项目冲刺4-3

仓库地址:https://github.com/bitpurleclude/GDUT-Goofish.git这个作业属于哪个课程 (https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/join?id=CfDJ8AOXHS93SCdEnLt5HW8VuxT_rAhbZKO3TfjMmbv1B0Re5Fp2d0_QACha2ZoYZ4fxF-ZKCCAhfJl7B8mvCfesLYE02X8T6kx_2R8w0SR-ykrgDVRKW…

【Linux】git note -v command not found

安装note.js Node.Js中文网 『Win+E』『此电脑』右键点击『属性』『高级系统设置』-『环境变量』『系统变量』-『NOTE_PATH』“C:\Program Files\nodejs”『用户变量』-『Path』“C:\Program Files\nodejs”『Win+R』重新启动控制台『cmd』-“$NOTE -v” 双击重新启动『Git Ba…

2024.11.13 DP题单

录制唱片 你刚刚继承了流行的 “破锣摇滚” 乐队录制的尚未发表的 \(N\)(\(1\leq N\leq 20\))首歌的版权。你打算从中精选一些歌曲,发行 \(M\)(\(1\leq M\leq 20\))张 CD。每一张 CD 最多可以容纳 \(T\)(\(1\leq T\leq 20\))分钟的音乐,一首歌不能分装在两张 CD 中。CD…

基于HASM模型的高精度建模matlab仿真

1.程序功能描述 本课题主要使用HASM进行高精度建模,主要对HASM模型进行介绍以及在实际中如何进行简化实现的。HASM原始的模型如下所示: 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 3.核心程序%第一类基本变量E(i,j) = 1 + (( f(i,j+1,n) - f(i,j-1,n) )/( …

CICD04 Jenkins容器化CICD实现及分布式构建, 流水线Pipeline ubuntu使用

2.14.3 案例: 基于 Docker 插件实现自由风格任务实现 Docker 镜像 制作 不如前面的直接脚本编写灵活 2.14.3.2 安装插件 docker-build-step jenkins上安装 docker-build-step 插件#选择jenkins使用的docker服务 #左侧系统管理,右侧系统配置,Docker Builder下Docker URL输入 u…