【经典算法】LeetCode 72. 编辑距离(Java/C/Python3/Go实现含注释说明,中等)
题目描述
给定两个单词 word1
和 word2
,计算出将 word1
转换成 word2
所使用的最少操作数。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
原题:LeetCode 72
思路及实现
方式一:动态规划
思路
使用二维数组 dp
来保存子问题的解,其中 dp[i][j]
表示 word1
的前 i
个字符转换成 word2
的前 j
个字符所需要的最少操作数。
- 当
word1[i-1] == word2[j-1]
时,不需要进行操作,dp[i][j] = dp[i-1][j-1]
。 - 当
word1[i-1] != word2[j-1]
时,可以选择插入、删除或替换操作,取这三种操作的最小值加1,即dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
。
代码实现
Java版本
public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();// 创建一个二维数组dpint[][] dp = new int[m + 1][n + 1];// 初始化第一行和第一列for (int i = 0; i <= m; i++) {dp[i][0] = i;}for (int j = 0; j <= n; j++) {dp[0][j] = j;}// 填充dp数组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] = 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1]));}}}return dp[m][n];
}
说明:Java版本使用了二维数组
dp
来保存中间结果,并通过循环填充该数组。
C语言版本
#include <stdio.h>
#include <string.h>
#include <limits.h>int minDistance(char *word1, char *word2) {int m = strlen(word1);int n = strlen(word2);// 创建一个二维数组dpint dp[m + 1][n + 1];// 初始化第一行和第一列for (int i = 0; i <= m; i++) {dp[i][0] = i;}for (int j = 0; j <= n; j++) {dp[0][j] = j;}// 填充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] = 1 + fmin(fmin(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]);}}}return dp[m][n];
}
说明:C语言版本与Java版本类似,但使用了
fmin
函数来取最小值。
Python3版本
def minDistance(word1: str, word2: str) -> int:m, n =len(word1), len(word2)# 创建一个二维数组dpdp = [[0] * (n + 1) for _ in range(m + 1)]# 初始化第一行和第一列for i in range(m + 1):dp[i][0] = ifor j in range(n + 1):dp[0][j] = j# 填充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] = 1 + min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1])return dp[m][n]
说明:Python3版本使用列表推导式创建二维数组,并使用
min
函数来取最小值。
Golang版本
package mainimport ("fmt""math"
)func minDistance(word1 string, word2 string) int {m, n := len(word1), len(word2)// 创建一个二维数组dpdp := make([][]int, m+1)for i := range dp {dp[i] = make([]int, n+1)}// 初始化第一行和第一列for i := 0; i <= m; i++ {dp[i][0] = i}for j := 0; j <= n; j++ {dp[0][j] = j}// 填充dp数组for i := 1; i <= m; i++ {for j := 1; j <= n; j++ {if word1[i-1] == word2[j-1] {dp[i][j] = dp[i-1][j-1]} else {dp[i][j] = 1 + int(math.Min(float64(dp[i-1][j-1]), math.Min(float64(dp[i-1][j]), float64(dp[i][j-1]))))}}}return dp[m][n]
}func main() {word1 := "horse"word2 := "ros"fmt.Println(minDistance(word1, word2)) // 输出: 3
}
说明:Golang版本使用
make
函数创建二维切片,并使用math.Min
函数来取最小值。
复杂度分析
- 时间复杂度:O(m * n),其中m和n分别是两个单词的长度。因为我们需要遍历两个单词的所有字符。
- 空间复杂度:O(m * n),用于保存子问题的解。
总结
方式 | 优点 | 缺点 | 时间复杂度 | 空间复杂度 |
---|---|---|---|---|
方式一 | 逻辑清晰,易于实现 | 需要额外的空间来保存子问题的解 | O(m * n) | O(m * n) |
相似题目
相似题目 | 难度 | 链接 |
---|---|---|
leetcode 10 | 中等 | 力扣-10 |
leetcode 1143 | 中等 | 力扣-1143 |
leetcode 647 | 中等 | 力扣-647 |
相关文章:
【经典算法】LeetCode 72. 编辑距离(Java/C/Python3/Go实现含注释说明,中等)
题目描述 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 原题:LeetCode 72 思路及实现 方式一:动态规划 思路…...

webstorm 常用插件
安装插件步骤: 打开软件,文件 -- 设置-- 插件 -- 输入插件名称 -- 安装 代码截图: code screenShots 先选中代码,按 ctrl shift alt a,就可截取选中的代码颜色注释: comments highlighter 对注释的文字改变颜色高亮成对符号: h…...

clang:在 Win10 上编译 MIDI 音乐程序(二)
先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 访问 Swift.org - Download Swift 找到 Windows 10:x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ ,安装后大约占…...

【redis】Redis数据类型(三)List类型
目录 List类型介绍特点 List数据结构附:3.2以前的版本(介绍一下压缩列表和双向链表)压缩列表ZipList双向链表LinkedList 常用命令lpush示例 lpushx示例 rpush示例 rpushx示例 LPOP示例 RPOP示例 BLPOP非阻塞行为阻塞行为相同的 key 被多个客户端同时阻塞在 MULTI/EX…...

Java面试题:多线程2
如何停止正在运行的线程 1,使用退出标志,使线程正常退出(run方法中循环对退出标志进行判断) 2,使用stop()方法强行终止(不推荐) 3,调用interrupt()方法中断线程 打断阻塞线程(sleep,wait,join),线程会抛出InterruptedException异常 打断正常的线程,可以根据打断状态来标记…...

T型槽地轨承载力是如何连接整个制造过程的强力桥梁(北重公司设计)
T型槽地轨承载力的定义和计算 T型槽地轨是一种用于工业设备运输和装配的关键组件。它由世界上各行各业的生产商广泛采用,其有效的承载力使其成为连接整个制造过程的强力桥梁。本文将介绍T型槽地轨的承载力以及相关的设计要点和应用。 承载力的定义和计算 承载力是…...
【Numpy】一文向您详细介绍 np.linspace()
【Numpy】一文向您详细介绍 np.linspace() 🌈 欢迎莅临我的个人主页👈 这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的计算机专业人士,热衷于分享技术见…...

VMware虚拟网卡网络适配器出现黄色感叹号
问题发生:VMware在使用Ubuntu的过程中突然卡死,强制关闭开启后就发生了网络无法连接 找到电脑的设备管理发现VMware的适配器出现黄色感叹号 解决方法: 下载软件ccleaner 扫描问题,懒得去找就修复了所有的问题 最后发现适配器…...
论生命价值
我们该如何定义一个人的生命价值,这是一个十分值得我们深思的问题,而谈论到生命的价值,我们先从非人的东西去谈论它的价值,从我们作为人的角度去思考价值,一个东西对我们有用,这个东西能够让我们的主观上的…...

基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...

ubuntu开启message文件
环境:ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件;源文件中message被注释,如下图: 2、打开注释: 3、重启服务 systemctl restart rsyslog.service 如此即可!...

ISIS的基本概念
1.ISIS概述 IS-IS是一种链路状态路由协议,IS-IS与OSPF在许多方面非常相似, 例如运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此,然后建立邻接关系,并交互链路状态信息。 CLNS由以下三个部分组成: CLNP…...

Vue 工程化开发入门
Vue开发的两种方式: 核心包传统开发模式:基于html/css/js文件,直接引入核心包,开发Vue工程化开发模式:基于构建工具的环境中开发Vue 这里选择Vue cli脚手架 进行开发,搜索教程自行下载。 组件化开发 一个页…...

车牌号识别系统:PyQT5+QT Designe+crnn/PaddleOCR+YOLO+OpenCV矫正算法。
PyQT5&QT Designecrnn/PaddleOCRYOLO传统OpenCV矫正算法。可视化的车牌识别系统项目。 车牌号识别系统 项目绪论1.项目展示2.视频展示3.整体思路 一、PyQT5 和 QT Designer1.简介2.安装3.使用 二、YOLO检测算法三、OpenCV矫正算法四、crnn/PaddleOCR字符识别算法五、QT界面…...

【基于MAX98357的Minimax(百度)长文本语音合成TTS 接入教程】
【基于MAX98357的Minimax(百度)长文本语音合成TTS 接入教程】 1. 前言2. 先决条件2.1 硬件准备2.2 软件准备2.3 接线 3. 核心代码3.1 驱动实现3.2 代码解析 4. 播放文本5. 结论 视频地址: SeeedXIAO ESP32S3 Sense【基于MAX98357的Minimax&am…...

秋招后端开发面试题 - JVM底层原理
目录 JVM底层原理前言面试题Java 对象的创建过程?什么是指针碰撞?什么是空闲列表?/ 内存分配的两种方式?JVM 里 new 对象时,堆会发生抢占吗?JVM 是怎么设计来保证线程安全的?/ 内存分配并发问题…...
VUE2从入门到精通(一)
**************************************************************************************************************************************************************************** 1、课程概述 【1】前置储备:HTMLCSSJS、WebAPI、Ajax、Node.js 【2】1天&…...

cmake进阶:文件操作之写文件
一. 简介 cmake 提供了 file() 命令可对文件进行一系列操作,譬如读写文件、删除文件、文件重命名、拷贝文件、创建目录等等。 接下来 学习这个功能强大的 file() 命令。 本文学习 CMakeLists.txt语法中写文件操作。 二. cmake进阶:文件操作之写文件…...

ubuntu 安装单节点HBase
下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…...

HTTP 多个版本
了解一下各个版本的HTTP。 上个世纪90年代初期,蒂姆伯纳斯-李(Tim Berners-Lee)及其 CERN的团队共同努力,制定了互联网的基础,定义了互联网的四个构建模块: 超文本文档格式(HTML) …...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...