【LeetCode】动态规划—72. 编辑距离(附完整Python/C++代码)

动态规划—72. 编辑距离

  • 前言
  • 题目描述
  • 基本思路
    • 1. 问题定义
    • 2. 理解问题和递推关系
    • 3. 解决方法
      • 3.1 动态规划方法
      • 3.2 空间优化的动态规划
    • 4. 进一步优化
    • 5. 小总结
  • 代码实现
    • Python
      • Python3代码实现
      • Python 代码解释
    • C++
      • C++代码实现
      • C++ 代码解释
  • 总结:

前言

编辑距离问题是字符串处理中的经典问题之一,广泛应用于拼写纠正、DNA序列比对等领域。通过计算将一个字符串转换为另一个字符串所需的最小操作数,能够帮助我们评估它们之间的相似度。本文将详细分析编辑距离问题的基本思路,提供动态规划的实现方法,并展示 Python 和 C++ 的代码示例。

题目描述

在这里插入图片描述

基本思路

1. 问题定义

编辑距离(Edit Distance)是衡量两个字符串之间相似度的一种方法,定义为将一个字符串转换为另一个字符串所需的最少操作次数。允许的操作包括插入字符、删除字符和著换字符。

2. 理解问题和递推关系

  • 设定两个字符串 word1word2,其长度分别为 m m m n n n
  • 定义 d p [ i ] [ j ] dp[i][j] dp[i][j] 为将 word1 的前 i i i 个字符转换为 word2 的前 j j j 个字符所需的最小操作次数。
  • 递推关系:
    • 如果 w o r d 1 [ i − 1 ] = = w o r d 2 [ j − 1 ] word1[i-1] == word2[j-1] word1[i1]==word2[j1], 则 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] d p[i][j]=d p[i-1][j-1] dp[i][j]=dp[i1][j1] (不需要任何操作)。
    • 如果不相等,考虑三种操作:
      • 插入: d p [ i ] [ j − 1 ] + 1 d p[i][j-1]+1 dp[i][j1]+1
      • 删除: d p [ i − 1 ] [ j ] + 1 dp [i-1][j]+1 dp[i1][j]+1
      • 替换: d p [ i − 1 ] [ j − 1 ] + 1 dp[\mathrm{i}-1][j-1]+1 dp[i1][j1]+1
  • 综合以上情况,得到:
    d p [ i ] [ j ] = min ⁡ ( d p [ i − 1 ] [ j ] + 1 , d p [ i ] [ j − 1 ] + 1 , d p [ i − 1 ] [ j − 1 ] + 1 ) d p[i][j]=\min (d p[i-1][j]+1, d p[i][j-1]+1, d p[i-1][j-1]+1) dp[i][j]=min(dp[i1][j]+1,dp[i][j1]+1,dp[i1][j1]+1)

3. 解决方法

3.1 动态规划方法

  1. 创建一个二维数组 d p d p dp ,其大小为 ( m + 1 ) × ( n + 1 ) (m+1) \times(n+1) (m+1)×(n+1) ,用于存储不同状态的结果。
  2. 初始化 dp 数组的边界条件:
    • d p [ i ] [ 0 ] = i d p[i][0]=i dp[i][0]=i , 表示将 word1 的前 i i i 个字符转换为空字符串的操作次数(全部删除)。
    • d p [ 0 ] [ j ] = j d p[0][j]=j dp[0][j]=j ,表示将空字符串转换为 word2 的前 j j j 个字符的操作次数(全部插入)。
  3. 使用双重循环填充 dp 数组,利用上述递推关系。
  4. 最终结果为 d p [ m ] [ n ] d p[m][n] dp[m][n] ,即将整个 word1 转换为 word 2 的最小操作次数。

3.2 空间优化的动态规划

  • 由于 d p [ i ] [ j ] d p[i][j] dp[i][j] 只依赖于 d p [ i − 1 ] [ j ] 、 d p [ i ] [ j − 1 ] d p[i-1][j] 、 d p[i][j-1] dp[i1][j]dp[i][j1] d p [ i − 1 ] [ j − 1 ] d p[i-1][j-1] dp[i1][j1] ,可以将空间复杂度优化到 O ( n ) O(n) O(n) ,只使用一维数组。

4. 进一步优化

  • 空间复杂度优化:通过使用一维数组来存储当前行的结果,减少内存占用。
  • 时间复杂度:动态规划的时间复杂度为 O ( m ∗ n ) O(m * n) O(mn) ,适合中等规模的字符串比较。

5. 小总结

  • 编辑距离问题利用动态规划有效地解决了字符串转换的最优方案。
  • 通过合理的状态设计和空间优化,能够显著提高算法在处理大规模输入时的性能。
  • 理解该问题不仅有助于掌握动态规划的基本思想,还能应用于实际的文本处理和相似度计算等领域。

以上就是问题的基本思路。

代码实现

Python

Python3代码实现

class Solution:def minDistance(self, word1: str, word2: str) -> int:m, n = len(word1), len(word2)# 创建dp数组dp = [[0] * (n + 1) for _ in range(m + 1)]# 初始化边界条件for i in range(m + 1):dp[i][0] = i  # word1 到空字符串的距离for j in range(n + 1):dp[0][j] = j  # 空字符串到 word2 的距离# 填充dp数组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]  # 字符相同else:dp[i][j] = min(dp[i - 1][j] + 1,    # 删除dp[i][j - 1] + 1,    # 插入dp[i - 1][j - 1] + 1)  # 替换# 返回最小编辑距离return dp[m][n]

Python 代码解释

  • 初始化:创建 dp 数组并设置边界条件,分别表示将一个字符串转换为空字符串的操作次数。
  • 填充 dp 数组:使用双重循环计算每个子问题的最小操作次数,依赖于之前的结果。
  • 返回结果:最终返回 dp[m][n],即将整个 word1 转换为 word2 所需的最小操作次数。

C++

C++代码实现

class Solution {
public:int minDistance(string word1, string word2) {int m = word1.size(), n = word2.size();// 创建dp数组vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));// 初始化边界条件for (int i = 0; i <= m; i++) {dp[i][0] = i;  // word1 到空字符串的距离}for (int j = 0; j <= n; j++) {dp[0][j] = j;  // 空字符串到 word2 的距离}// 填充dp数组for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {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[m][n];}
};

C++ 代码解释

  • 初始化:创建 dp 数组并设置边界条件,分别表示将一个字符串转换为空字符串的操作次数。
  • 动态规划填充:使用双重循环遍历每个可能的子问题,依据字符是否相同来更新 dp 数组。
  • 返回结果:返回 dp[m][n],即将整个 word1 转换为 word2 所需的最小操作次数。

总结:

  • 编辑距离问题通过动态规划有效地解决了字符串之间的相似性评估,具有重要的实际应用价值。
  • 理解并掌握该问题的解决方法,不仅对学习动态规划有帮助,还为处理更复杂的字符串匹配问题提供了基础。
  • 通过对空间复杂度的优化,能够在处理更大规模输入时,保持算法的高效性。

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

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

相关文章

threejs-模型贴图颜色与图片存在色差 问题解决方案

我使用的是obj模型&#xff0c;然后加载的话使用的是texturelLoader加载器&#xff0c;效果是这样的 使用的场景是&#xff1a;能够将图片贴到衣服上&#xff0c;并且能够移动旋转等操作贴图&#xff0c;但是这存在很明显的色差问题&#xff0c;具体的解决方案是&#xff1a; 我…

.Net Core 接口或网站发布到IIS

将.Net Core 接口或网站发布到IIS上&#xff0c;需要遵循一系列步骤来确保正确配置和部署。下面将以.NET Core 3.1的api接口发布示范&#xff1a; 一、环境准备 安装.NET Core 3.1 SDK和运行时&#xff1a; 在服务器上安装.NET Core 3.1 SDK&#xff08;如果需要在服务器上编译…

LeetCode 48 Rotate Image 解题思路和python代码

题目&#xff1a; You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …

桥水基金、贝莱德、摩根士丹利选择极狐GitLab 的五大理由!

疯狂上涨的 A股、港股 节前一周&#xff0c;上证指数累计上涨超 12%&#xff0c;创下2008年11月以来最大单周涨幅&#xff1b;深证成指累计上涨超17%&#xff0c;创下1996年4月最大单周涨幅&#xff1b;创业板指上涨超22%&#xff0c;创下史上最大单周涨幅。 过去两周&#x…

1688代采系统-反向海淘系统详细介绍

Onebound凡邦1688代采系统-反向海淘系统是一种专为海外买家及跨境电商提供一站式采购解决方案的平台。其核心功能和服务旨在解决跨境采购中的语言、货币等常见问题&#xff0c;并优化采购流程&#xff0c;提高采购效率。以下是对该系统的详细介绍。 一、核心功能 商品采集与展…

基于Java(Jsp+Sevlet)+MySql 实现的(Web)成绩管理系统

1 概述 1.1 开发背景 随着学生数量的日渐增多&#xff0c;学生教务系统的数据量也不断增加&#xff0c;这无疑大大增加了教务系统的负担。如果能把负责学生成绩管理的模块独立出来形成一个独立的系统&#xff0c;便可以有效降低教务系统的数据量&#xff0c;不仅可以方便管理…

2003-2023年上市公司政府补助明细数据

2003-2023年上市公司政府补助明细数据 1、时间&#xff1a;2003-2023年 2、来源&#xff1a;通过整理和筛选于企业财务报表附注“营业外收入”下的“政府补助明细”得到 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、省份、城市、区县、上市状态、政府补助金额、…

企业架构系列(16)ArchiMate第14节:实施和迁移视角

在企业架构中&#xff0c;为了有效地规划和管理架构的变更与实施&#xff0c;通常会使用不同的视角来描述架构的不同方面。本篇涉及到三个主要视角&#xff1a;项目视角、迁移视角以及实施与迁移视角。 一、实施和迁移视角概览 1.项目视角 元素与关系&#xff1a;关注项目本身…

基于ResNet50模型的船型识别与分类系统研究

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

获取时隔半个钟的三天

摘要&#xff1a; 今天遇到需求是配送时间&#xff0c;时隔半个钟的排线&#xff01;所以需要拼接时间&#xff01;例如2024-10-08 14&#xff1a;30&#xff0c;2024-10-08 15&#xff1a;00&#xff0c;2024-10-08 15&#xff1a;30 <el-form-item label"配送时间&a…

AP8505固定5V输出5V0.2A,SOP7/DIP7非隔离开关电源IC

AP8505基于高压同步整流架构&#xff0c;集成PFM控制器以及500V高可靠性MOSFET&#xff0c;用于外部元器件极精简的小功率非隔离开关电源。AP8505无线门铃芯片内置500V高压启动&#xff0c;实现系统快速启动、超低待机功能。5V非隔离无线门铃芯片AP8505提供了完整的智能化保护功…

海报制作用什么软件?快速搞定年末各种节日借势海报设计

厌倦了自己动手从零开始做宣传海报&#xff1f; 想要找AI智能工具&#xff0c;却又觉得生成的图片太假&#xff0c;不够的宣传格调&#xff1f; 想要找海报制作模板免费下载的平台&#xff0c;还总找不到自己想要的那一个风格的模板&#xff1f; 有没有想过&#xff0c;是你…

fastdfs下的doc文件可以访问,但是图片无法访问报错404,解决记录

fastdfs下的doc文件可以访问,但是图片无法访问报错404 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 第1项:查看Nginx的日志 可以先去查看Nginx的日志,在你Nginx的安装目录下的lo…

N1从安卓盒子刷成armbian

Release Armbian_noble_save_2024.10 ophub/amlogic-s9xxx-armbian (github.com) armbian下载&#xff0c;这里要选择905d adb 下载地址 https://dl.google.com/android/repository/platform-tools-latest-windows.zip 提示信息 恩山无线论坛 使用usb image tool restet a…

探索创新宝库:一站式免费专利检索工具揭秘!

在这个知识爆炸的时代&#xff0c;专利不仅是创新成果的保护伞&#xff0c;更是技术发展的指南针。对于研究者、发明家、企业乃至普通爱好者&#xff0c;专利检索成为了探索技术前沿、规避侵权风险、激发创新灵感的重要手段。今天&#xff0c;我们将带您了解一款集多功能于一身…

第七在线7thonline荣耀加冕 斩获“最佳数据洞察平台”与“产业互联网最具发展潜力企业”两项大奖!

在科技创新与数字化转型的浪潮中&#xff0c;7thonline第七在线再次以卓越的技术实力和深厚的行业积累&#xff0c;赢得了业界的广泛认可&#xff0c;一举斩获“最佳数据洞察平台“和“产业互联网最具发展潜力企业”两项大奖。 01、“最佳数据洞察平台” “Ai新智奖”是国内首个…

网络安全基础知识面试题库

目录 1 基于路由器的攻击手段 1.1 源IP地址欺骗式攻击 1.2 源路由攻击 1.2.1 源路由 1.3 极小数据段攻击 2 RARP协议 3 自主访问控制 3.1 自主访问控制策略DAC 3.2 强制访问控制策略MAC 3.3 基于角色的访问控制策略RBAC 4 电子邮件的安全协议&#xff0c;Pretty Goo…

图书商城|基于springBoot的图书商城管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数…

关于PPT生成的开源大模型总结

目前需要开源的PPT生成模型&#xff0c;在这里对github上的一些模型进行筛选 搜索关键词&#xff1a;ppt generate&#xff08;more starts&#xff09; williamfzc/chat-gpt-ppt: 支持直接生成PPT支持中英文需要调用ChatGPT&#xff08;Add your token (official openai api k…

你知道U盘怎么加密吗?

1、使用Windows BitLocker&#xff1a; 适用于Windows 10/11专业版及以上版本。 插入U盘&#xff0c;右键点击U盘图标&#xff0c;选择“启用BitLocker”。 设置密码&#xff0c;并选择加密选项&#xff0c;点击“开始加密”。 2、使用Mac的Disk Utility&#xff1a; 适用…