【算法一则】编辑距离 【动态规划】

题目

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

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

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

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')
提示:

0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成

题解

这个问题可以使用动态规划来解决。我们可以定义一个二维数组dp,其中dp[i][j]表示将word1的前i个字符转换成word2的前j个字符所需的最少操作数。
在这里插入图片描述

首先,我们需要初始化dp数组的边界条件。当word1为空字符串时,要将其转换成word2的前j个字符,需要进行j次插入操作;同样地,当word2为空字符串时,要将word1的前i个字符转换成空字符串,需要进行i次删除操作。因此,我们可以初始化dp数组的第一行和第一列如下:

dp[0][j] = j,对于所有的0 <= j <= word2.length()
dp[i][0] = i,对于所有的0 <= i <= word1.length()

接下来,我们可以通过填充dp数组的其余部分来求解最少操作数。我们可以遍历word1和word2的所有字符,对于每一对字符word1[i-1]和word2[j-1],我们可以进行以下操作:

在这里插入图片描述

如果word1[i-1]等于word2[j-1],则不需要进行任何操作,dp[i][j] = dp[i-1][j-1];
如果word1[i-1]不等于word2[j-1],则可以进行插入、删除或替换操作。我们可以选择其中操作数最小的一种,即dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1;
最后,dp[word1.length()][word2.length()]即为将word1转换成word2所需的最少操作数。

代码

public int minDistance(String word1, String word2) {
    int n = word1.length();
    int m = word2.length();
    // dp[i][j] 表示 word1 的前 i 个字母和 word2 的前 j 个字母之间的编辑距离
    int[][] dp = new int[n + 1][m + 1];
    // base case
    for (int i = 0; i <= n; i++) {
        dp[i][0] = i;
    }
    for (int j = 0; j <= m; j++) {
        dp[0][j] = j;
    }
    // 自底向上求解
    for (int i = 1; i <= n; i++) {
        char c1 = word1.charAt(i - 1);
        for (int j = 1; j <= m; j++) {
            char c2 = word2.charAt(j - 1);
            if (c1 == c2) { // 相同字符,不需要操作
                dp[i][j] = dp[i - 1][j - 1];
            } else { // 不同字符,取三种操作的最小值
                dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
            }
        }
    }
    return dp[n][m];
}

总结

上面的提供了一种使用动态规划解决将一个单词转换成另一个单词所需的最少操作数的算法。以下是算法的主要步骤:

  • 初始化一个二维数组dp,其中dp[i][j]表示将word1的前i个字符转换成word2的前j个字符所需的最少操作数。
    ( 初始化dp数组的边界条件:当word1为空字符串时,要将其转换成word2的前j个字符,需要进行j次插入操作;当word2为空字符串时,要将word1的前i个字符转换成空字符串,需要进行i次删除操作。
  • 遍历word1和word2的所有字符,对于每一对字符word1[i-1]和word2[j-1]:
  • 如果word1[i-1]等于word2[j-1],则不需要进行任何操作,dp[i][j] = dp[i-1][j-1];
  • 如果word1[i-1]不等于word2[j-1],则可以进行插入、删除或替换操作。选择其中操作数最小的一种,即dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1。
  • 返回dp[word1.length()][word2.length()],即将word1转换成word2所需的最少操作数。
    这个算法的时间复杂度为O(m×n),其中m和n分别是word1和word2的长度。通过动态规划的思想,我们可以高效地求解这个问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一篇出色的答辩状,需要在“答”与“辩”两方面下功夫,你做到了吗?

一篇出色的答辩状&#xff0c;需要在“答”与“辩”两方面下功夫&#xff0c;你做到了吗&#xff1f; 在法律诉讼中&#xff0c;答辩状的重要性不言而喻。它不仅是你回应对方指控的主要手段&#xff0c;也是展示你立场和观点的关键平台。在#李秘书讲写作#看来&#xff0c;一篇…

AMEYA360 | 纳芯微发布首款1200V SiC MOSFET

纳芯微推出1200V首款SiC MOSFET NPC060N120A系列产品&#xff0c;该产品RDSon为60mΩ&#xff0c;具有通孔式TO-247-4L与表面贴装TO-263-7L两种封装形式&#xff0c;可提供车规与工规两种等级。 纳芯微的碳化硅MOSFET具有卓越的RDSon温度稳定性、门极驱动电压覆盖度更宽、具备高…

Spring AI ETL 流水线

先纠正 Spring AI 使用本地 Ollama Embeddings 中的一个错误&#xff0c;当启动 Ollama 之后&#xff0c;Windows会有托盘图标&#xff0c;此时已经启动了 Ollama 的服务&#xff0c;访问 Embedding 时不需要运行 ollama run gemma &#xff0c;只有访问 chat 时才需要启动一个…

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法&#xff0c;主要用于数据聚类。其工作原理基于迭代优化&#xff0c;将数据点划分为K个集群&#xff0c;使得每个数据点都属于最近的集群&#xff0c;并且每个集群的中心&#xff08;质心&#xff09;是所有属于该集群的数据点的平均值。以下是…

中文核心计算机视觉项目分享:多通道注意力机制得农业作物图像识别检测-完整代码+论文

创新点&#xff1a; 在苹果数据集中&#xff0c;存在遮挡、不同角度的拍摄、光照变化等问题&#xff0c;导致目标检测的性能下降。为了解决这些问题&#xff0c;提出智能感知优化网络和多路径特征融合网络。 智能感知优化网络&#xff1a;帮助模型更好地关注感兴趣的目标区域&…

电商技术揭秘二十七:跨境电商物流解决方案

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

C语言学习笔记之指针(二)

指针基础知识&#xff1a;C语言学习笔记之指针&#xff08;一&#xff09;-CSDN博客 目录 字符指针 代码分析 指针数组 数组指针 函数指针 代码分析&#xff08;出自《C陷阱和缺陷》&#xff09; 函数指针数组 指向函数指针数组的指针 回调函数 qsort() 字符指针 一…

试用模方时,系统一直提示“未找到有效配置文件” ,是需要安装3dsmax吗 ?

问题如图 把文件放在认证管理服务安装目录下即可。&#xff08;注&#xff1a;因平台限制&#xff0c;需要文件的直接后台私信即可哦&#xff09; 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件…

软考 - 系统架构设计师 - 数据架构真题

问题 1&#xff1a; (相当于根据题目中提到的 4 点&#xff0c;说一下关系型数据库的缺点) &#xff08;1&#xff09;.用户数量的剧增导致并发负载非常高&#xff0c;往往会达到每秒上万次读写请求。关系数据库应付每秒上万次的 SQL 查询还勉强可以&#xff0c;但是应付上万…

车载摄像头夜景增强技术解决方案,解锁高质量夜间视觉体验

随着汽车智能化的快速发展&#xff0c;车载摄像头已成为驾驶辅助系统的核心组件。尤其在夜间行驶时&#xff0c;摄像头所捕捉的画面质量直接关系到驾驶者的安全感知和行车决策。然而&#xff0c;传统的车载摄像头在夜间往往面临噪声多、画质差等挑战&#xff0c;难以满足用户对…

goland2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Goland 是一款由 JetBrains 公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于 Go 语言的开发。它提供了丰富的功能和工具&#xff0c;帮助开发者更高效地编写、调试和管理 Go 语言项目。 功能特点&#x…

什么是Rust语言?探索安全系统编程的未来

&#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来 文章目录 &#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来摘要引言正文&#x1f4d8; Rust语言简介&#x1f31f; 发展历程&#x1f3af; Rust的技术意义和优势&#x1f4e6; Rust解决的问题…

基于逐笔数据合成高频订单簿:DolphinDB 订单簿引擎

订单簿是交易市场上买卖双方正在报价的不同价格的列表。订单簿快照反应了特定时刻市场上的交易意图&#xff0c;比如交易活跃的证券标的往往有着密集的订单簿。订单簿快照对量化金融的交易策略、风险管理和市场分析等方面都具有重要意义。 通常交易所可以提供实时和历史的行情…

无界系统实战课:全体系落地无界改版后选择、出价、高投产做付费引流-38节

课程内容&#xff1a; 001.01、如何快速学习无界推广(新学员先听).mp4 002.02、如何快速上手和适应无界(老学员先听).mp4 003.03、无界推广在运营中的作用(必听).mp4 004.04、无界多工具如何选择(必听).mp4 005.05、自定义出价、控成本、最大化底层逻辑和选择(必听).mp4 …

postgres插件部署+函数开发 - pl/java安装(centos7)

一、安装postgres sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql11-server sudo /usr/pgsql-11/bin/postgresql-11-setup initdb sudo systemctl enable postg…

stable diffusion--小白学习步骤

1.看一下Unet网络的讲解_哔哩哔哩_bilibili&#xff0c;了解Unet网络 2.看一下【生成式AI】Diffusion Model 原理剖析 (1/4)_哔哩哔哩_bilibili&#xff0c;起码要看前3/6个视频 3.看一下超详细的扩散模型&#xff08;Diffusion Models&#xff09;原理代码 - 知乎 (zhihu.co…

前端-vue项目debugger调试

一、前言 有的时候接受同事一个项目&#xff0c;用框架不一样&#xff0c;写的也不太规范&#xff0c;那么就需要打断点去学习改项目的流程了。 那么vue项目是如何debugger调试呢&#xff1f; 二、操作 大概理解一下&#xff0c;vue项目启动&#xff0c;大概是先启动框架&am…

nginx 卸载和安装超详细教程

一、前言 由于现在nginx有版本漏洞&#xff0c;所以很多安装过nginx的需要卸载重新安装&#xff0c;没安装过的&#xff0c;切记不要乱安装版本。 OK以上版本切记不能再用了&#xff01; 废话不多说&#xff0c;直接上干货。 二、卸载 1、停止Nginx进程 命令行停止&#xf…

【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步…

【日常记录】【CSS】利用动画延迟实现复杂动画

文章目录 1、介绍2、原理3、代码4、参考链接 1、介绍 对于这个效果而言&#xff0c;最先想到的就是 监听滑块的input事件来做一些操作 ,但是会发现&#xff0c;对于某一个节点的时候&#xff0c;这个样式操作起来比较麻烦 只看这个代码的话&#xff0c;发现他用的是动画&#x…