LeetCode 126题:单词接龙 II

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

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

  • 导航

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

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

题目描述

给定两个单词(beginWordendWord)和一个字典 wordList,找出所有从 beginWordendWord 的最短转换序列的转换过程,转换需遵循如下规则:

  1. 每次转换只能改变一个字母。
  2. 转换过程中的中间单词必须在字典 wordList 中。

说明:

  • 如果不存在这样的转换序列,返回一个空列表。
  • 所有单词具有相同的长度。
  • 所有单词只包含小写字母。
  • 字典 wordList 是非空的,且不包含重复的单词。
  • beginWordendWord 是非空的,且不相同。

示例:

输入:

beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出:

[
  ["hit","hot","dot","dog","cog"],
  ["hit","hot","lot","log","cog"]
]

方法一:广度优先搜索(BFS)+ 回溯

解题步骤

  1. 使用 BFS 确定最短路径长度并记录每个单词的所有可能前驱词。
  2. endWord 开始,使用回溯法根据前驱词列表构造所有有效路径。

Python 示例

from collections import defaultdict, deque

def findLadders(beginWord, endWord, wordList):
    if endWord not in wordList:
        return []
    
    wordList = set(wordList)
    layer = {}
    layer[beginWord] = [[beginWord]]

    while layer:
        newlayer = defaultdict(list)
        for word in layer:
            if word == endWord:
                return layer[word]
            for i in range(len(word)):
                for c in 'abcdefghijklmnopqrstuvwxyz':
                    newword = word[:i] + c + word[i+1:]
                    if newword in wordList:
                        newlayer[newword] += [j + [newword] for j in layer[word]]
        
        wordList -= set(newlayer.keys())
        layer = newlayer
    
    return []

# Example usage
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log","cog"]
print(findLadders(beginWord, endWord, wordList))

算法分析

  • 时间复杂度: O(N * M^2),N 是 wordList 的长度,M 是单词的长度。
  • 空间复杂度: O(N * M),存储转换路径所需空间。

方法一:广度优先搜索(BFS)+ 回溯 图解说明

在方法一中,我们使用广度优先搜索(BFS)和回溯的组合来解决单词接龙 II 问题。这种方法的核心在于逐层扩展当前单词,直到找到目标单词 endWord。图解的详细步骤如下:

  1. 初始化

    • 创建一个字典 layer 来存储每一层的单词及其对应的路径。初始时,layer 包含 beginWord 和它自身构成的路径(["hit"])。
  2. 广度优先搜索

    • 遍历当前层的每个单词,尝试改变单词中的每一个字符,用 26 个字母替换,生成新的单词。
    • 检查每个新生成的单词是否在 wordList 中。如果在,将其加入到下一层的搜索中,并记录路径。
    • 重要的是,一旦一个单词被用于构建路径,它就会从 wordList 中移除,这避免了重复访问并减少了搜索空间。
  3. 路径记录

    • 对于每个有效的转换单词,我们更新 newlayer 字典,将新单词的路径扩展为从上一层单词衍生出的所有可能路径。
    • 例如,从 “hit” 到 “hot”,如果 “hot” 能转换为 “dot” 和 “lot”,则路径更新为从 “hit” 到 “hot” 再到这些单词的路径。
  4. 检查终点

    • 在每层搜索结束时,检查 endWord 是否已经出现在当前层的路径中。如果出现,就意味着找到了最短路径,函数返回当前层对应的 endWord 的所有路径。
  5. 循环继续

    • 更新 layernewlayer,进行下一轮层的搜索,直到找到 endWord 或者没有新单词可以搜索。
示意图

考虑 beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] 的情况:

Layer 0: hit
         |
Layer 1: hot
        / \
Layer 2:dot lot
       /    \
Layer 3:dog  log
       \     /
Layer 4:  cog

在这个示意图中,广度优先搜索首先找到与 “hit” 一个字母不同的所有单词(即 “hot”),然后再从 “hot” 扩展到 “dot” 和 “lot”,以此类推,直到到达 “cog”。每一步都保证是最短的可能路径,因为我们是逐层扩展的。

方法二:双向广度优先搜索(Bi-directional BFS)

解题步骤

  1. beginWordendWord 同时开始搜索,每次扩展较小的层。
  2. 当两个搜索方向在中间某处相遇时,使用所有累积的路径构建最终路径。

Python 示例

def findLadders(beginWord, endWord, wordList):
    if endWord not in wordList:
        return []
    tree, words, n = defaultdict(set), set(wordList), len(beginWord)
    if beginWord in words: words.remove(beginWord)
    found, q, nq = False, {beginWord}, set()
    while q and not found:
        words -= set(q)
        for x in q:
            for y in [x[:i] + c + x[i + 1:] for i in range(n) for c in 'abcdefghijklmnopqrstuvwxyz']:
                if y in words:
                    if y == endWord: found = True
                    else: nq.add(y)
                    tree[x].add(y)
        q, nq = nq, set()

    def bt(x): return [[x]] if x == endWord else [[x] + rest for y in tree[x] for rest in bt(y)]
    return bt(beginWord)

# Example usage
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log","cog"]
print(findLadders(beginWord, endWord, wordList))

算法分析

  • 时间复杂度: O(N * M^2),类似于单向 BFS。
  • 空间复杂度: O(N * M),需要存储中间状态和构建路径。

算法图解与说明

双向广度优先搜索可以更快地找到路径因为它从两端同时搜索,减少了搜索的广度。

这两种方法都可以有效地找出所有最短的从 beginWordendWord 的路径,第二种方法通常更快,尤其是在大数据集上。

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

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
在这里插入图片描述

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

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

相关文章

系统思考—团队学习

结束昨日435期JSTO“探索学习的新视界:硬核工具分享”,有伙伴分享的提升效率的AI工具,也有自我发现团队问题解决的工具,伙伴们都在各自的领域实践、吸收、反馈、复盘。这次的团队学习不仅是知识的传递,更是一场脑力激荡…

详解pytorch中循环神经网络(RNN、LSTM、GRU)的维度

详解pytorch中循环神经网络(RNN、LSTM、GRU)的维度 RNNtorch.nn.rnn详解RNN输入输出维度 LSTMtorch.nn.LSTM详解LSTM输入输出维度 GRUtorch.nn.GRU详解GRU输入输出维度 三种RNN的示例 首先如果你对RNN、LSTM、GRU不太熟悉,可点击查看。 RNN …

2万字实操入门案例之在Springboot框架下用Mybatis简化JDBC开发实现基础的操作MySQL之预编译SQL主键返回增删改查

环境准备 准备数据库表 use mybatis;-- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comme…

做一个犬榜小程序,警示社会。

2024-5-15新闻:流浪狗咬死3岁男童。 相关链接:3岁男童被恶犬咬伤离世 母亲发声 急寻狗主讨公道_中华网 恶狗的主人终于付出代价 链接:这回,恶狗的主人终于付出代价 - 知乎 7岁女童家门口玩耍被恶犬咬伤头面部,多处撕…

【SQL每日一练】获取PADS公司用户名称和各职业总数并根据格式输出

文章目录 题目一、解析二、题解1.MySQL 题目 生成以下两个结果集: 1、查询 OCCUPATIONS 表中所有名字,紧跟每个职业的第一个字母作为括号(即:括在括号中),并按名字顺序排序。例如:AnActorName…

OpenCV-android-sdk配置及使用(NDK)

opencv官网下载Android版Releases - OpenCV 下载好OpenCV-android-sdk并解压好,然后新建一个jni文件夹测试,测试项目目录结构如下: ├── jni │ ├── Android.mk │ ├── Application.mk │ └── test.cpp Application.mk: APP_STL := c++_static APP_CPP…

Cow Exhibition G的来龙去脉

[USACO03FALL] Cow Exhibition G - 洛谷 曲折经过 爆搜 一开始没什么好的想法&#xff0c;就针对每头奶牛去or不去进行了爆搜。 #include <cstdio> #include <algorithm> using namespace std;#define maxn 405 int iq[maxn], eq[maxn]; int ans; int n;void d…

Stm32串口搭配DMA实现自定义printf、scanf

前言:本文仅供学习参考使用&#xff0c;主要目的是让大家快速使用串口调试&#xff0c;文章所提及的GCC适用于Clion&#xff0c;Vscode等第三方编辑器的用户。作者有时间会继续更新^_^ 一、GCC环境 1、标准库 (1)、使用方法 在主函数while(1)初始化中&#xff0c;添加Seria…

【复试分数线】综合性985历年分数线汇总(第四弹)

国家线和34所自划线 可以看作是考研上岸最最最基础的门槛。真正决定你能不能进入复试的还要看院线&#xff08;复试分数线&#xff09;&#xff01;今天我将分析考信号的除C9、工科类985的其他7所985近三年复试分数线&#xff08;不包括2024&#xff09;&#xff0c;大家可以参…

Web前端开发 - 4 - CSS3动画

CSS3动画 一、 设计2D变换二、 设计3D变换三、 设计过渡动画四、设计帧动画 一、 设计2D变换 transform : none | <transform-function> /* <transform-function> 设置变换函数&#xff0c;可以是一个或多个变换函数列表。函数包括: martrix(x缩放,x倾斜,y倾斜,y…

玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 01 - 从一个简单模型开始学习之旅 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 01 - 从一个简单模型开始学习之旅 前言一、从模板开始建模二、建模一个简单的连杆2.1 建模2.2 生成子系统 总结 前言 在产…

如何在 Windows 11/10 中恢复已删除的分区

在将重要数据存储在计算机上之前&#xff0c;许多用户会创建分区以更好地组织和管理他们的文件。此分区可以在内部硬盘驱动器或外部存储设备上创建。但是&#xff0c;有时可能会意外删除分区。如果发生这种情况&#xff0c;您可能想知道是否可以在不丢失任何信息的情况下恢复已…

适用于 Windows 8/10/11 的 10 大 PC 迁移工具:电脑克隆迁移软件

当您发现自己拥有一台新的 PC 或笔记本电脑时&#xff0c;PC 迁移变得至关重要。将数据从旧计算机传输到新计算机的过程似乎令人生畏&#xff0c;尤其是如果您是第一次这样做。迁移过程中数据丢失的潜在风险加剧了焦虑。为确保文件和系统设置的无缝无忧传输&#xff0c;使用专为…

初识C语言——第二十天

do while ()循环 do 循环语句; while(表达式); 句式结构&#xff1a; 执行过程&#xff1a; do while循环的特点&#xff1a; 代码练习&#xff1a; 二分法算法&#xff1a; int main() {int arr[] { 0,1,2,3,4,5,6,7,8,9};int k 7;//查找数字7&#xff0c;在arr这个数组…

prompt工程策略(三:使用 LLM 防护围栏创建系统提示)

原文&#xff1a;我是如何赢得GPT-4提示工程大赛冠军的 原文的原文&#xff1a; How I Won Singapore’s GPT-4 Prompt Engineering Competition &#xff01;&#xff01;本内容仅适用于具有 System Prompt&#xff08;系统提示&#xff09;功能的 LLM。具有这一功能的最著名 …

Python sort() 和 sorted() 的区别应用实例详解

大家好&#xff0c;今天针对 Python 中 sort() 和 sorted() 之间的区别&#xff0c;来一个实例详细解读。sort — 顾名思义就是排序的意思&#xff0c;它可以接收的对象为可迭代的数据类型。今天以列表为例子演示两者的不同点、相同点&#xff0c;以及其中一些常用的高级参数使…

【3dmax笔记】022:文件合并、导入、导出

文章目录 一、合并二、导入三、导出四、注意事项一、合并 只能合并 max 文件(高版本能够合并低版本模型,低版本不能合并高版本的模型)。点击【文件】→【导入】→【合并】: 选择要合并的文件,后缀名为3dmax默认的格式,max文件。 二、导入 点击【文件】→【导入】→【导…

NSSCTF中的1zjs、作业管理系统、finalrce、websign、简单包含、Http pro max plus

目录 [LitCTF 2023]1zjs [LitCTF 2023]作业管理系统 [SWPUCTF 2021 新生赛]finalrce exec()函数&#xff1a;php中exec介绍及使用_php exec-CSDN博客​​​​​​ 资料参考&#xff1a;RCE(远程命令执行)绕过总结_rce绕过-CSDN博客 [UUCTF 2022 新生赛]websign [鹏城杯 …

【校园论坛系统】分站式后台,多城市圈子论坛,校园圈子交流平台,二手发布市场,校园圈子论坛系统

简述 校园论坛系统是为学生们提供一个交流、分享信息、互相帮助的平台。它通常包括了各种分类的版块&#xff0c;例如学习交流、社团活动、二手交易、失物招领等等。用户可以在论坛上发帖&#xff0c;回复他人的帖子&#xff0c;也可以私信其他用户。此外&#xff0c;管理员还…

只用了三天就入门了Vue3?

"真的我学Vue3&#xff0c;只是为了完成JAVA课设" 环境配置 使用Vue3要去先下载Node.js。 就像用Python离不开pip包管理器一样。 Node.js — Run JavaScript Everywhere (nodejs.org) 下完Node.js去学习怎么使用npm包管理器&#xff0c;放心你只需要学一些基础的…