深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)

news2024/11/16 13:23:06

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

在本篇文章中,我们将详细解读力扣第161题“相隔为 1 的编辑距离”。通过学习本篇文章,读者将掌握如何判断两个字符串是否只有一个编辑操作的距离,并了解相关的复杂度分析。除了逐字符比较的方法,还将介绍其他解法。每种方法都将配以详细的解释和ASCII图解,以便于理解。

问题描述

力扣第161题“相隔为 1 的编辑距离”描述如下:

给定两个字符串 st,判断它们是否只有一个编辑操作的距离。编辑操作包括插入一个字符、删除一个字符或者替换一个字符。

示例 1:

输入: s = "ab", t = "acb"
输出: true
解释: 可以通过插入一个字符 'c' 使得字符串 t 变为 "abc"。

示例 2:

输入: s = "cab", t = "ad"
输出: false
解释: 无论进行哪种编辑操作,都不能将 s 转换为 t。

示例 3:

输入: s = "1203", t = "1213"
输出: true
解释: 可以通过替换字符 '0' 为字符 '1' 使得字符串 t 变为 "1213"。

解题思路

  1. 初步分析
    • 两个字符串之间只有一个编辑操作的距离,意味着我们可以通过一次插入、删除或替换一个字符将其中一个字符串转换为另一个字符串。
    • 可以通过比较字符串的长度来判断可能的编辑操作类型。

方法一:逐字符比较

  1. 步骤
    • 首先比较两个字符串的长度,判断可能的编辑操作类型。
    • 如果长度相同,则检查是否可以通过一次替换操作将一个字符串转换为另一个字符串。
    • 如果长度相差为1,则检查是否可以通过一次插入或删除操作将一个字符串转换为另一个字符串。
代码实现
def isOneEditDistance(s, t):
    m, n = len(s), len(t)
    
    # 确保 s 是较短的字符串
    if m > n:
        return isOneEditDistance(t, s)
    
    # 长度差大于1,则不可能只通过一次编辑操作完成转换
    if n - m > 1:
        return False
    
    for i in range(m):
        if s[i] != t[i]:
            # 长度相同,则必须是一次替换操作
            if m == n:
                return s[i + 1:] == t[i + 1:]
            # 长度不同,则必须是一次插入操作
            else:
                return s[i:] == t[i + 1:]
    
    # 字符串末尾插入情况
    return m + 1 == n

# 测试案例
print(isOneEditDistance("ab", "acb"))  # 输出: true
print(isOneEditDistance("cab", "ad"))  # 输出: false
print(isOneEditDistance("1203", "1213"))  # 输出: true
ASCII图解

假设输入字符串为 “ab” 和 “acb”,图解如下:

s = "ab"
t = "acb"

逐字符比较:
s[0] == t[0] -> 'a' == 'a'
s[1] != t[1] -> 'b' != 'c'
检查 s[1:] == t[2:] -> "b" == "b"

返回 true

方法二:动态规划

动态规划是一种更为通用的方法,虽然在这个问题中并不一定是最优解法,但它在处理更多编辑操作(如多次编辑操作)时非常有用。

  1. 步骤
    • 构建一个二维数组 dp,其中 dp[i][j] 表示字符串 s[0:i]t[0:j] 的编辑距离。
    • 初始化 dp 数组,对于空字符串的编辑操作初始化为其长度。
    • 填充 dp 数组,根据不同的编辑操作(插入、删除、替换)更新 dp 值。
    • 检查 dp 数组最后一行和最后一列的值,判断是否为1。
代码实现
def isOneEditDistanceDP(s, t):
    m, n = len(s), len(t)
    
    if abs(m - n) > 1:
        return False
    
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    
    for i in range(m + 1):
        for j in range(n + 1):
            if i == 0:
                dp[i][j] = j
            elif j == 0:
                dp[i][j] = i
            elif s[i - 1] == t[j - 1]:
                dp[i][j] = dp[i - 1][j - 1]
            else:
                dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
    
    return dp[m][n] == 1

# 测试案例
print(isOneEditDistanceDP("ab", "acb"))  # 输出: true
print(isOneEditDistanceDP("cab", "ad"))  # 输出: false
print(isOneEditDistanceDP("1203", "1213"))  # 输出: true
ASCII图解

假设输入字符串为 “ab” 和 “acb”,图解如下:

s = "ab"
t = "acb"

动态规划表格:
    ''  a  c  b
''  0  1  2  3
 a  1  0  1  2
 b  2  1  1  1

检查 dp[2][3] == 1
返回 true

复杂度分析

  • 时间复杂度
    • 逐字符比较法:O(n),其中 n 是较短字符串的长度。
    • 动态规划法:O(m * n),其中 m 和 n 分别是字符串 s 和 t 的长度。
  • 空间复杂度
    • 逐字符比较法:O(1),只使用了常数空间来存储计数变量和索引。
    • 动态规划法:O(m * n),需要额外的二维数组空间来存储 dp 值。

测试案例分析

  1. 测试案例 1

    • 输入: s = "ab", t = "acb"
    • 输出: true
    • 解释: 可以通过插入一个字符 ‘c’ 使得字符串 t 变为 “abc”。
  2. 测试案例 2

    • 输入: s = "cab", t = "ad"
    • 输出: false
    • 解释: 无论进行哪种编辑操作,都不能将 s 转换为 t。
  3. 测试案例 3

    • 输入: s = "1203", t = "1213"
    • 输出: true
    • 解释: 可以通过替换字符 ‘0’ 为字符 ‘1’ 使得字符串 t 变为 “1213”。

总结

本文详细解读了力扣第161题“相隔为 1 的编辑距离”,通过逐字符比较和动态规划两种方法,高效地解决了这一问题。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

参考资料

  • 《算法导论》—— Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
  • 力扣官方题解

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️关注公众号 数据分析螺丝钉 回复 学习资料 领取高价值免费学习资料❥(^_-)
在这里插入图片描述

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

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

相关文章

手把手教你搭建一个花店小程序商城

如果你是一位花店店主,想要为你的生意搭建一个精美的小程序商城,以下是你将遵循的五个步骤。 步骤1:登录乔拓云平台进入后台 首先,你需要登录乔拓云平台的后台管理页面。你可以在电脑或移动设备上的浏览器中输入乔拓云的官方网站…

STM32使用旋转编码开关

一、旋转编码开关如何工作 编码器内部有一个开槽圆盘,连接到公共接地引脚 C。它还具有两个接触针 A 和 B,如下所示。 当您转动旋钮时,A 和 B 按照特定顺序与公共接地引脚 C 接触,具体顺序取决于转动旋钮的方向。 当它们与公共地接…

VSCode SAP Systems配置HTTPS访问SAP

第一次访问提示,Self-Signed 证书 解决办法:https访问SAP Fiori网站,导出SSL证书为DER格式保存到硬盘上 双击DER文件,导入到系统 退出VSCode,再次启动 Test Connection, 提示 The system URL is using a hostname o…

计算机系统概述习题

选择题 电子计算机问世至今,新型计算机不断推陈出新,不管怎么更新,依然具有“存储程序”的特点,最早提出这种概念的是(B) A. 巴贝奇 B. 冯*诺伊曼 C. 帕斯卡 D. 贝尔 B下列描述中___是正确的。 A. 控制器能理解,解释…

【C语言深度解剖】(17):预处理和程序环境

🤡博客主页:醉竺 🥰本文专栏:《C语言深度解剖》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多C语言深度解剖点击专栏链接查看&…

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客,考场分层次安排,最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能,程序见后。 1、自动分页,每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页,…

tomcat--安全配置多虚拟机

端口8005/tcp 安全配置管理 8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成…

用手机打印需要下载什么软件

在快节奏的现代生活中,打印需求无处不在,无论是工作文件、学习资料还是生活小贴士,都可能需要一纸呈现。然而,传统的打印方式往往受限于时间和地点,让人倍感不便。今天,就为大家推荐一款便捷又省钱的手机打…

第三讲 栈、队列和数组 (1)

文章目录 第三讲 栈、队列和数组3.1 栈3.1.1 出栈元素的不同排列与卡特兰数3.1.2 栈的顺序表实现3.1.3共享栈3.1.4 栈的链表实现3.1.5 栈的两种实现的优缺点3.1.6 c中的栈( s t a c k stack stack)容器适配器3.1.7 栈的应用:star:3.1.7.1 **栈在括号匹配中的应用**3.1.7.2 **栈…

9.STL中list的常见操作(图文并茂)

目录 1.list的介绍及使用 1.1.list的构造 1.2 list iterator的使用 1.3. list capacity 1.4.list modifiers 1.5.list的迭代器失效 1.list的介绍及使用 list介绍 ,可以通过以下图直观的感受到 vector 和 list 的区别 Vector 插入代价高,但便于排…

Java中String类常用方法

写笔记记录自己的学习记录以及巩固细节 目录 1.String类的常用方法 1.1 字符串构造 1.2 String对象的比较 1.2.1 比较两个字符串是否相等 1.2.2 比较两个字符串的大小 1.3 字符串查找 1.4 字符串的转化 1.4.1 字符串转整数 1.4.2 字符串转数字 1.4.3 大小写的转换 1…

[Redis]使用和原理

Redis介绍 Redis 是⼀种基于键值对的 NoSQL 数据库, Redis 可以满足很多的应用场景,而且因为 Redis 会将所有数据都存放再内存中,所以它的读写性能非常惊人。不仅如此,Redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上…

数据库的事务四大特性(ACID)以及详解隔离性以及隔离级别

目录 一、事务相关概念 1、事务 2、事务的本质 3、回滚 4、事务使用 5、事务的四大特性 1、原子性(Atomicity) 2、一致性(Consistency) 3、隔离性(Isolation) 4、持久性(Durability&a…

专业级润滑油,一站式批发服务

要为机械设备提供持久稳定的动力保障吗?选择我们的专业级润滑油,让您的设备运转更顺畅,效率更高。 我们专业从事润滑油批发多年,以优质的产品、合理的价格和完善的服务赢得了广大客户的信赖。无论是汽车、机械还是工业设备&#x…

Python中动态调用C#的dll动态链接库中方法

在Python中调用C#的dll库_哔哩哔哩_bilibili 环境准备: 安装 pythonnet pip install pythonnet在Python中调用C#动态链接库(DLL),可以使用pythonnet库,它允许直接使用 .NET 的程序集。以下是一个示例,…

话题:如何让大模型变得更聪明?

随着人工智能(AI)技术的迅速发展,大模型(如GPT-4、BERT、Transformer等)在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而,如何让大模型变得更聪明,进一步提升其性能和应用效果&a…

Softing工业推出新品edgeGate:一款用于工业边缘和云应用的硬件网关

2024年4月17日(哈尔),Softing工业自动化在2024年汉诺威工业博览会上首次展示了新品edgeGate。该产品是一个无需维护的硬件物联网网关解决方案,可将生产数据从PLC和数控机床控制器传输至工业边缘及物联网云平台。 (edge…

重学java 38.创建线程的方式⭐

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一种方式_继承extends Thread方法 1.定义一个类,继承Thread 2.重写run方法,在run方法中设置线程任务(所谓的线程任务指的是此线程要干的具体的事儿,具体执行的代码) 3.创建自定义线程…

光伏企业都在用的户用光伏管理软件——鹧鸪云

随着全球对可再生能源和清洁能源的需求日益增长,光伏产业作为其中的佼佼者,正迎来前所未有的发展机遇。然而,随着光伏电站规模的扩大和分布范围的增加,如何高效、智能地管理这些电站,确保它们稳定、安全地运行&#xf…

做好商业分析,帮你用有限的资源选择高效益项目实现战略目标

对于组织来说,资源条件总是有限的,为了实现战略目标,则需要从众多项目中筛选出最合适的项目来实现收益。但项目的筛选往往会遇到很多难点,如信息收集不全影响筛选的准确性、评估标准不明确或难以量化、决策过程复杂等等。 那么如何…