LeetCode题练习与总结:编辑距离--72

一、题目描述

给你两个单词 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
  • word1word2 由小写英文字母组成

二、解题思路

定义一个二维数组 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需要的最少操作数。对于 dp 数组的每一个元素,我们可以根据以下情况来更新它的值:

1. 如果 word1[i] == word2[j],则 dp[i][j] = dp[i-1][j-1],因为当前字符匹配,所以不需要任何操作,直接继承前面的结果。

2. 如果 word1[i] != word2[j],则 dp[i][j] 可以通过以下三种操作之一得到:

  • 插入一个字符:dp[i][j] = dp[i][j-1] + 1,相当于将 word2[j] 插入到 word1 中。
  • 删除一个字符:dp[i][j] = dp[i-1][j] + 1,相当于将 word1[i] 删除。
  • 替换一个字符:dp[i][j] = dp[i-1][j-1] + 1,相当于将 word1[i] 替换为 word2[j]
  • 在这三种操作中,我们选择操作数最少的一种。

初始化 dp 数组时,dp[0][j] 表示将一个空字符串转换为 word2 的前 j 个字符所需要的操作数,显然为 j;同理,dp[i][0] 表示将 word1 的前 i 个字符转换为空字符串所需要的操作数,显然为 i

三、具体代码

class Solution {public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();// dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需要的最少操作数int[][] dp = new int[m + 1][n + 1];// 初始化 dp 数组for (int i = 0; i <= m; i++) {dp[i][0] = i;}for (int j = 0; j <= n; j++) {dp[0][j] = j;}// 动态规划过程for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;}}}// 返回最终结果return dp[m][n];}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 我们有一个双层循环,分别遍历字符串 word1 和 word2 的所有字符。
  • 外层循环遍历 word1 的每个字符,共有 m 次迭代(其中 m 是 word1 的长度)。
  • 内层循环遍历 word2 的每个字符,共有 n 次迭代(其中 n 是 word2 的长度)。
  • 在循环的每次迭代中,我们执行的是常数时间的操作,即比较字符、更新动态规划数组。
  • 因此,总的时间复杂度是 O(m * n),即两个字符串长度的乘积。
2. 空间复杂度
  • 我们定义了一个二维数组 dp,其大小为 (m + 1) * (n + 1),其中 m 和 n 分别是字符串 word1 和 word2 的长度。
  • 这个二维数组用于存储从 word1 的前 i 个字符转换到 word2 的前 j 个字符所需的最少操作数。
  • 因此,空间复杂度也是 O(m * n),即两个字符串长度的乘积。

五、总结知识点

1. 动态规划(Dynamic Programming, DP):

  • 动态规划是一种算法设计技术,用于求解具有重叠子问题和最优子结构特性的复杂问题。
  • 它将问题分解为较小的子问题,并存储这些子问题的解,以避免重复计算。
  • 在本问题中,dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需要的最少操作数。

2. 二维数组:

  • 二维数组是一种数据结构,用于存储多个相同类型的元素,这些元素以行和列的形式排列。
  • 在本问题中,dp 是一个二维数组,用于存储不同子问题的解。

3. 字符串操作:

  • charAt(int index) 方法用于获取字符串中指定索引处的字符。
  • 在本问题中,使用 charAt(i - 1) 来获取 word1 和 word2 字符串中的字符,因为数组的索引从 0 开始,而 dp 数组的维度是从 1 开始的。

4. 数学函数:

  • Math.min() 函数用于在多个值中选择最小值。
  • 在本问题中,使用 Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) 来确定在当前字符不匹配时,进行插入、删除或替换操作中的最小操作数。

5. 循环结构:

  • 使用了双层循环来遍历 word1 和 word2 的所有字符组合,以填充 dp 数组。

6. 边界条件处理:

  • 使用了单独的循环来初始化 dp 数组的边界条件,即当其中一个字符串为空时,转换为另一个字符串所需的操作数。

7. 递推关系:

  • 通过比较当前字符是否相等,定义了 dp 数组的递推关系,即如果字符相等,则操作数不变;如果字符不等,则取插入、删除、替换三种操作中的最小操作数加一。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

window cmd/PowerShell 实时查看监控日志命令Get-Content,类似与linux shell的tail命令

命令 最近10行&#xff0c;使用UTF8字符编码 Get-Content app.log -Wait -Tail 10 -Encoding UTF8查找“关键字”&#xff0c;忽略大小写&#xff0c;显示关键字的上下1行 Get-Content app.log -Wait -Tail 10 -Encoding UTF8 | Select-String "keyword" -CaseSen…

clickhouse学习笔记04

ClickHouse高可用之ReplicatedMergeTree引擎介绍 ClickHouse高可用架构准备-环境说明和ZK搭建 RPM安装ClickHouse 上传我们的clickhouse rpm文件。 安装&#xff1a; 中途需要输入用户名和密码 可以不设置 直接回车。 启动&#xff1a; 查看状态&#xff1a; 查看端口是否占用…

【状态压缩 并集查找 图论】2157. 字符串分组

本文涉及知识点 状态压缩 并集查找 图论 LeetCode2157. 字符串分组 给你一个下标从 0 开始的字符串数组 words 。每个字符串都只包含 小写英文字母 。words 中任意一个子串中&#xff0c;每个字母都至多只出现一次。 如果通过以下操作之一&#xff0c;我们可以从 s1 的字母集…

Rust常用特型之AsRef和AsMut特型

在Rust标准库中&#xff0c;存在很多常用的工具类特型&#xff0c;它们能帮助我们写出更具有Rust风格的代码。 今天我们要学习的AsRef和AsMut&#xff0c;和前面学习的Deref和DerefMut有那么一点混淆的地方。 当一个类型U实现了AsRef<T>&#xff0c;那么我们可以高效的从…

K8S哲学 - Pod、RC、RS、deployment

pod&#xff08;最小的可部署单元&#xff09; 容器组&#xff08;运行一个或多个容器&#xff09; Pod(容器组&#xff09;是Kubernetes 中最小的可部署单元。 一个Pod(容器组&#xff09;包含了一个应用程序容器&#xff08;某些情况下是多个容器&#xff09;、存储资源、 一…

C++练级之路——类和对象(中二)

1、运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也是具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型和参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需…

【C++初识继承】

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 本篇文章主要讲解 继承 的相关内容 目录 1. 继承的概念和定义 1.1 继承的概念 1.2 继承的定义 1.2.1 继承定义格式 1.2.2 继承方式与访问修饰限定符 2. 基类和派生类对象赋值转换 3. 继承中的作用域 …

npm常用命令详解(二)

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理器&#xff0c;它允许你安装、共享和管理Node.js代码库。以下是一些常用的npm命令及其详解&#xff0c;以帮助您更好地理解和使用它。 1. npm doc 功能&#xff1a;查看指定包的文档。 语法&#xff1a;np…

linux离线安装mysql

一、下载mysql 地址&#xff1a;MySQL 这里选择64为还是32为要根据操作系统来 uname -m 二、上传解压配置mysql 使用root账户登录linux服务器&#xff0c;在opt文件下创建mysql文件夹 cd /opt sudo mkdir mysql 使用Xftp上传mysql压缩包到此文件夹下(自行决定路径) cd mysql/…

基于Kubernetes集群构建MongoDB

基于Kubernetes集群构建MongoDB 作者:行癫(盗版必究) 一:基础环境 1.Kubernetes集群正常运行 2.Harbor私有仓库正常运行 二:MongoDB项目部署 ​ MongoDB项目对应Kubernetes的yaml文件: --- apiVersion: v1 kind: Namespace metadata:name: m

力扣:104. 二叉树的最大深度(Java,DFS,BFS)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a;1.深度优先搜索&#xff08;递归&#xff09;2.广度优先搜索&#xff08;队列&#xff09; 题目描述&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从…

【QT进阶】Qt http编程之后端API测试工具postman使用介绍

往期回顾 【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等-CSDN博客 【QT进阶】Qt Web混合编程之实现ECharts数据交互动态修改-CSDN博客 【QT进阶】Qt http编程之http与https简单介绍-CSDN博客 【QT进阶】Qt http编程之后端API测试工具postman使用介绍 其实这个工具的…

nextjs getStaticProps 和 getServerSideProps 区别

getStaticProps 和 getServerSideProps 是 Next.js 中用于数据获取的两个重要函数&#xff0c;它们在页面渲染时分别起到不同的作用。 1、getStaticProps&#xff1a; 用途&#xff1a;主要用于静态生成页面&#xff0c;即在构建时获取数据并将其预先注入到页面中。执行环境&…

Pytorch的下载安装

本文为自己整理的Pytorch下载相关的内容笔记&#xff0c;以便日后查阅 一. 基本命令 1.查看conda版本 conda --version2.创建conda新环境 conda create –n 名称 python版本3.查看已经创建的conda环境 conda info --envs4.进入虚拟环境 conda activate 环境名称 为了避免…

【Day 3】Ajax + Vue 项目、路由 + Nginx

1 Ajax Asynchronous JavaScript And XML 异步的 JavaScript 和 XML 作用&#xff1a; 数据交换 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据 异步交互 可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xf…

【大模型应用极简开发入门(1)】LLM概述:LLM在AI中所处位置、NLP技术的演变、Transformer与GPT、以及GPT模型文本生成逻辑

文章目录 一. AI中大语言模型的位置与技术发展1. 从AI到Transformer2. NLP&#xff1a;自然语言处理3. LLM大型语言模型&#xff1a;NLP的一种特定技术3.1. LLM定义3.2. LLM的技术发展3.2.1. n-gram模型3.2.2. RNN与LSTM 二. Transformer在LLM中脱颖而出1. Transformer架构能力…

编译一个基于debian/ubuntu,centos,arhlinux第三方系统

目录 前言 准备工作 下载linux源码进行编译 linux源码下载 网站 问题 解决办法 编译 可能会遇到的问题 chroot下载debian环境 进入虚拟环境 把chroot的根目录文件打包为.gz文件 编译init文件&#xff08;用于系统启动时的一系列引导&#xff09; 给予文件夹权限 …

碎碎笔记01

凹凸性 一元函数 凸函数&#xff1a;二阶导数>0 f ( x ) x 2 f(x) x^2 f(x)x2的二阶导数是 2&#xff0c;>0凹函数&#xff1a;二阶导数<0 驻点&#xff0c;拐点 驻点&#xff1a;增减性的交替点 拐点&#xff1a;凹凸性的交替点 脑补 f ( x ) s i n x f(x) …

【树莓派学习】hello,world!

系统安装及环境配置详见【树莓派学习】系统烧录及VNC连接、文件传输-CSDN博客 树莓派内置python3&#xff0c;可以直接利用python输出。

Docker 部署 MongoDB 数据库

文章目录 官网地址docker 网络mongod.conf部署 MongoDB部署 mongo-expressdocker-compose.ymlMongoDB shell 官网地址 https://www.mongodb.com/zh-cn docker 网络 # 创建 mongo_network 网络 docker network create mongo_network # 查看网络 docker network list # 容器连…