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

动态规划 - 编辑距离

115. 不同的子序列

困难

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

算法思想:利用动态规划,分s[i - 1] 与 t[j - 1]相等,s[i - 1] 与 t[j - 1] 不相等两种情况具体讨论如何匹配。

1、dp数组及其下标含义:dp[i][j] 以i-1为结尾的字符串s中包含以j-1为结尾的字符串t

的个数。

2、递推公式:

  • s[i - 1] 与 t[j - 1]相等: dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
  • s[i - 1] 与 t[j - 1] 不相等: dp[i][j] = dp[i - 1][j]

如果s[i-1] == t[j-1],dp[i][j]可以有两部分组成。

一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。

一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。

例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配.

如果s[i-1] != t[i-1],那么不能用s[i-1]来匹配(模拟在s中删除这个元素),dp[i][j] = dp[i-1][j]

3、初始化

dp[0][0] = 1, dp[i][0] = 1(s匹配空字符串,删除到为空这一种方法),dp[0][j] = 0()

4、遍历

从前到后,从上到下

class Solution:def numDistinct(self, s: str, t: str) -> int:dp = [[0] * (len(t)+1) for _ in range(len(s)+1)]for i in range(len(s)):dp[i][0] = 1for j in range(1, len(t)):dp[0][j] = 0for 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] #用s[i - 1]来匹配和不用else:dp[i][j] = dp[i-1][j]# 不能用s[i-1]来匹配(模拟在s中删除这个元素)return dp[-1][-1]

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

中等

给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数

每步 可以删除任意一个字符串中的一个字符。

直接删 

算法思想:利用动态规划,如果word1[i-1] == word2[j-1]相等,那么不需要删除操作,如果不相等,那么可以删word1、word2或者都删,取最小值。

1、dp数组及其下标含义:dp[i][j] 以i-1为结尾的字符串word1和以j-1为结尾的字符串word2

最少需要删除几次可以相等。

2、递推公式:

  • s[i - 1] 与 t[j - 1]相等: dp[i][j] = dp[i - 1][j - 1]
  • s[i - 1] 与 t[j - 1] 不相等: dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1,dp[i-1][j-1]+2)

如果s[i-1] == t[j-1],不需要删。dp[i][j] = dp[i - 1][j - 1]

如果s[i-1] != t[i-1],有三种删除方式,删word1/word2/都删,取最小值

3、初始化

dp[0][0] = 1, dp[i][0] = i;dp[0][j] = j

4、遍历

从前到后,从上到下

class Solution:def minDistance(self, word1: str, word2: str) -> int:dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]for i in range(len(word1)+1):dp[i][0] = ifor j in range(1, len(word2)+1):dp[0][j] = jfor 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: # 不相等,可以删word1\word2\都删 dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1,dp[i-1][j-1]+2)return dp[-1][-1]

求最长公共子序列

class Solution(object):def minDistance(self, word1, word2):m, n = len(word1), len(word2)# dp 求解两字符串最长公共子序列dp = [[0] * (n+1) for _ in range(m+1)]for i in range(1, m+1):for j in range(1, n+1):if word1[i-1] == word2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])# 删去最长公共子序列以外元素return m + n - 2 * dp[-1][-1]

72. 编辑距离 

中等

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

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

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

1、dp数组及其下标含义:dp[i][j] 以i-1为结尾的字符串word1和以j-1为结尾的字符串word2

最少需要操作几次可以相等。

2、递推公式:

  • s[i - 1] 与 t[j - 1]相等: dp[i][j] = dp[i - 1][j - 1]
  • s[i - 1] 与 t[j - 1] 不相等: dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1,dp[i-1][j-1]+1)

如果s[i-1] == t[j-1],不需要操作。dp[i][j] = dp[i - 1][j - 1]

如果s[i-1] != t[i-1],可以插入、删除、替换

  •         删除:删word1: dp[i][j] = dp[i - 1][j] +1;删word2: dp[i][j] = dp[i][j-1] +1
  •         插入:相当于删除
  •         替换:只需一次操作,dp[i][j] = dp[i - 1][j - 1] + 1

3、初始化

dp[0][0] = 1, dp[i][0] = i;dp[0][j] = j

4、遍历

从前到后,从上到下

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

 

相关文章:

动态规划 - 编辑距离

115. 不同的子序列 困难 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 7 取模。 算法思想:利用动态规划,分s[i - 1] 与 t[j - 1]相等,s[i - 1] 与 t[j - 1] 不相等两种情况具…...

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...

C02S04-Ubuntu基本使用

一、Ubuntu初始配置 1. 使用root用户 Ubuntu系统默认只能使用普通用户,要想使用root用户,需要先设置root用户密码。 进入终端,配置root用户密码。按照提示输入密码。 sudo passwd root配置完成后,执行下面的密码,切换…...

C语言 | Leetcode C语言题解之第525题连续数组

题目: 题解: struct HashTable {int key, val;UT_hash_handle hh; };int findMaxLength(int* nums, int numsSize) {int maxLength 0;struct HashTable* hashTable NULL;struct HashTable* tmp malloc(sizeof(struct HashTable));tmp->key 0, tm…...

Qml-Transition的使用

Qml-Transition的使用 Transition的概述 Transition:定义了当状态发生改变时应用的动画属性animations : list:(Transition)过渡的动画属性enabled : bool:状态发生变化时,是否使能此过渡(Transition)动画…...

Notepad++检索包含多个关键字的行

Notepad检索包含多个关键字的行 在Notepad中,你可以使用正则表达式来检索包含多个关键字的行。以下是具体步骤: 打开Notepad,打开要搜索的文件。 点击菜单栏上的“搜索”选项,然后选择“查找”。 在弹出的查找对话框中&#xf…...

C语言:水仙花树,要求三位以上的N位整数每位的N次方等于数本身,全部输出出来

#include <stdio.h> int main() { int n; scanf("%d",&n);//这里是说明多少n位整数 int first1; int i1; while(i<n){//此while循环可以得到n位数的最小位,例如3位的100. first*10; i; } ifirst; whil…...

金融贷款口子超市V2源码 Thinkphp开发的贷款和超市平台源码(亲测源码含安装视频教程)

金融贷款口子超市V2源码 Thinkphp开发的贷款和超市平台源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89938268 更多资源下载&#xff1a;关注我。...

redis的三种客户端

在 Redis 中&#xff0c;常用的 Java 客户端有三种&#xff1a;Jedis、Lettuce 和 Redisson。它们各有特点&#xff0c;适用于不同的场景。以下是它们的详细介绍&#xff0c;以及如何在 Spring Boot 中集成 Redis。 一、Redis 三种常用客户端详解 1.1 Jedis Jedis 是 Redis 官…...

边缘计算【智能+安全检测】系列教程--agx orin解决RTC时间问题

因为是离线运行&#xff0c;首要问题是时间不准确&#xff0c;就在主板上加装了纽扣电池&#xff0c;但是会有一系列问题&#xff0c;比如无法将RTC时间回写到系统时间&#xff0c;或者无法将系统时间写到RTC中等等一些列问题。为解决这些问题&#xff0c;一劳永逸的方式&#…...

数据库动态扩容:Java实现与技术策略

引言 数据库动态扩容是应对数据量增长和业务需求变化的关键技术。它允许数据库系统在不停机的情况下&#xff0c;通过增加或减少资源来适应业务负载的变化。本文将详细介绍数据库动态扩容的工作原理、技术策略&#xff0c;并提供Java代码示例。 1. 数据库动态扩容的工作原理 …...

Golang | Leetcode Golang题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; func findMaxLength(nums []int) (maxLength int) {mp : map[int]int{0: -1}counter : 0for i, num : range nums {if num 1 {counter} else {counter--}if prevIndex, has : mp[counter]; has {maxLength max(maxLength, i-prevIndex)} …...

低代码架构浅析

低代码的定义与应用场景 定义 低代码平台是一种通过可视化工具和预定义组件实现快速应用开发的环境&#xff0c;显著减少了编码量。它旨在简化开发流程&#xff0c;加快应用交付&#xff0c;提高开发效率&#xff0c;使非技术人员也能参与应用开发。 应用场景 企业内部应用 …...

mysql字段是datetime如何按照小时来统计

在 MySQL 中&#xff0c;如果你有一个包含 DATETIME 类型的列&#xff0c;并且你想按照小时来统计数据&#xff0c;可以使用 DATE_FORMAT 函数将 DATETIME 列格式化为仅包含日期和小时的形式&#xff0c;然后使用 GROUP BY 子句来分组。 假设你有一个名为 events 的表&#xf…...

nacos快速启动

预备环境准备&#xff1a; 确保是64 bit OS&#xff08;推荐Linux/Unix/Mac&#xff09;&#xff0c;安装64 bit JDK 1.8并下载&配置&#xff0c;安装Maven 3.2.x并下载&配置。 下载源码或者安装包&#xff1a; 从Github上下载源码方式&#xff1a; git clone https://…...

@Excel若依导出异常/解决BusinessBaseEntity里面的字段不支持导出

今天发现所有实体类继承BusinessBaseEntity里面的这些通用字段不支持导出&#xff0c;debug时发现是这样&#xff1a; 导出效果 这里我把能查到的方法都汇总了&#xff0c;如果你也遇到这个异常&#xff0c;可以去逐步排查 1.先看库里有没有数据 2.看字段名是否对齐 3.所需要…...

虚拟机 Email 恢复专用工具:Virtual Machine Email Recovery

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 天津鸿萌科贸发展有限公司是 SysTools 系列数据恢复、取证及…...

代理人工智能如何应对现代威胁的速度和数量

Seven AI首席执行官 Lior Div 讨论了代理 AI 的概念及其在网络安全中的应用。他解释了代理 AI 与传统自动化安全系统的区别&#xff0c;即代理 AI 具有更大的自主性和决策能力。 Div 强调&#xff0c;通过实时处理大量警报&#xff0c;代理 AI 特别适合对抗现代 AI 驱动的威胁…...

element-plus版本过老,自写选项弹框增删功能

title: element-plus版本过老&#xff0c;自写选项弹框增删功能 date: 2024-10-31 10:53:18 tags: element-plus 1.情景 发现代码怎么都用不了el-select的#footer插槽从而实现不了相关的操作&#xff0c;发现el-select自带的管理相关数据的属性popper-class用不了。 2.原因与…...

Python毕业设计选题:基于django+vue的宠物寄养平台的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 1. 前台系统功能模块 系统首页界面 用户注册界面 用户登录界面 宠物商城界面 宠物店…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...