LeetCode题练习与总结:单词接龙--127

一、题目描述

字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk

  • 每一对相邻的单词只差一个字母。
  •  对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
  • sk == endWord

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

 

示例 1:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。

示例 2:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:0
解释:endWord "cog" 不在字典中,所以无法进行转换。

提示:

  • 1 <= beginWord.length <= 10
  • endWord.length == beginWord.length
  • 1 <= wordList.length <= 5000
  • wordList[i].length == beginWord.length
  • beginWordendWord 和 wordList[i] 由小写英文字母组成
  • beginWord != endWord
  • wordList 中的所有字符串 互不相同

二、解题思路

  1. 将单词列表转换为图:首先,我们需要构建一个图,其中包含 wordList 中的所有单词。这可以通过比较每对单词并检查它们是否只有一个字符不同来实现。

  2. 广度优先搜索:从 beginWord 开始,进行广度优先搜索,寻找 endWord。在搜索过程中,我们记录从 beginWord 到当前单词的路径长度。

  3. 终止条件:一旦我们找到了 endWord,我们就知道我们已经找到了最短的转换序列,并且可以返回当前的路径长度。

  4. 优化:为了提高搜索效率,我们可以在开始 BFS 之前预处理 wordList,创建一个通用状态映射,这样我们可以快速找到所有与给定单词只有一个字符差异的单词。

三、具体代码

import java.util.*;public class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {// 将单词列表转换为集合,便于快速查找Set<String> wordSet = new HashSet<>(wordList);if (!wordSet.contains(endWord)) return 0;// BFS 队列Queue<String> queue = new LinkedList<>();queue.offer(beginWord);// 记录已访问的单词Set<String> visited = new HashSet<>();visited.add(beginWord);// 记录转换序列的长度int level = 1;while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {String currentWord = queue.poll();// 如果找到了结束单词if (currentWord.equals(endWord)) {return level;}// 遍历当前单词的所有可能转换for (String nextWord : getNextWords(currentWord, wordSet)) {if (!visited.contains(nextWord)) {queue.offer(nextWord);visited.add(nextWord);}}}level++;}return 0;}// 获取当前单词的所有可能转换private List<String> getNextWords(String word, Set<String> wordSet) {List<String> nextWords = new ArrayList<>();for (char ch = 'a'; ch <= 'z'; ch++) {for (int i = 0; i < word.length(); i++) {// 生成下一个可能的单词String nextWord = replace(word, i, ch);if (wordSet.contains(nextWord)) {nextWords.add(nextWord);}}}return nextWords;}// 替换单词中的某个字符private String replace(String word, int index, char ch) {char[] chars = word.toCharArray();chars[index] = ch;return new String(chars);}
}

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

1. 时间复杂度
  • 构建 wordSet:将 wordList 转换为 HashSet 的时间复杂度是 O(N),其中 N 是 wordList 的长度。

  • BFS 遍历:在 BFS 过程中,每个单词都可能生成 26 * L 个新单词,其中 L 是单词的长度。在最坏的情况下,所有单词都可能被访问一次。因此,时间复杂度是 O(N * 26 * L)。

  • getNextWords 函数:对于每个单词,我们检查 26 * L 个可能的转换。这个操作的时间复杂度是 O(26 * L)。

  • replace 函数:这个函数的时间复杂度是 O(L),因为我们只是替换了一个字符并生成了一个新的字符串。

  • 综上所述,总的时间复杂度是 O(N * 26 * L)。

2. 空间复杂度
  • wordSet 和 visited:这两个 HashSet 最多存储 N 个单词,因此它们的空间复杂度是 O(N)。

  • 队列 queue:在 BFS 过程中,队列中最多可能存储 N 个单词,因此空间复杂度是 O(N)。

  • nextWords 列表:在 getNextWords 函数中,这个列表最多可能存储 26 * L 个单词,因此空间复杂度是 O(26 * L)。

  • 其他变量:如 level 和循环中的临时变量等,它们的空间复杂度是 O(1)。

  • 综上所述,总的空间复杂度是 O(N + 26 * L)。

综合来看,这个算法的时间复杂度是 O(N * 26 * L),空间复杂度是 O(N + 26 * L)。

五、总结知识点

  1. 集合的使用HashSet 用于存储不重复的元素,并提供了快速的查找、添加和删除操作。代码中使用了 HashSet 来存储 wordList 和已访问的单词。

  2. 队列的使用LinkedList 作为队列使用,实现了先进先出的数据结构。在 BFS 过程中,队列用于存储待访问的单词。

  3. 广度优先搜索(BFS):这是一种图遍历算法,用于在图中找到最短路径。代码中使用了 BFS 来找到从 beginWord 到 endWord 的最短转换序列。

  4. 字符串操作replace 函数展示了如何通过索引替换字符串中的字符。这涉及到字符串转字符数组,然后修改数组中的元素,最后将数组转回字符串。

  5. 循环和条件语句:代码中使用了 for 循环来遍历单词的每个字符和字母表中的每个字符,以及 if 语句来检查条件。

  6. 函数定义和调用:代码中定义了 ladderLengthgetNextWords 和 replace 三个函数,分别用于解决不同的问题。函数的定义和调用展示了模块化编程的思想。

  7. 字符和字符数组:代码中使用了字符变量 ch 来遍历字母表,并使用了字符数组 chars 来表示和操作字符串。

  8. 数据结构的选择:代码中选择合适的数据结构(如 HashSet 和 Queue)来优化算法的性能,特别是在单词查找和图遍历方面。

  9. 算法设计:代码实现了基于 BFS 的图遍历算法,这是一种常见的算法设计技巧,用于解决最短路径问题。

  10. 递归和迭代:虽然代码中没有直接使用递归,但 BFS 本身是一种递归思想的迭代实现,每次迭代都相当于展开递归的一层。

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

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

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

相关文章

GraogGNSSLib学习

GraogGNSSLib学习 程序编译环境版本项目编译结果问题 程序编译 GraphGNSSLib 环境版本 程序开源是在ubuntu16.04-kinetic环境跑通的&#xff0c;但是我的环境是UBUNTU20.04&#xff0c;所以&#xff0c;先进行了ROS的安装&#xff0c;因为我的系统是ubuntu20.04所以&#xf…

如何优化Flask-Report报表的性能和加载速度

如何优化Flask-Report报表的性能和加载速度 在开发Web应用时&#xff0c;报表生成是一个常见的需求。Flask-Report是一个强大的Flask扩展&#xff0c;可以帮助我们快速生成PDF报表。然而&#xff0c;随着数据量的增加和复杂性的提高&#xff0c;报表的生成速度和性能可能会受到…

Linux--MQTT(一)简介

一、简介 MQTT &#xff08; Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输&#xff09;&#xff0c; 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。 与 HTTP 协议一样&#xff0c; MQTT 协议也是应用层协议&#xff0c;工作在 TCP/IP 四…

k8s环境里查看containerd创建的容器对应的netns

如何查看containerd创建的容器对应的netns 要查看由 containerd 创建的容器对应的网络命名空间&#xff08;netns&#xff09;&#xff0c;你可以遵循以下步骤。这个过程涉及到了解容器的 ID&#xff0c;以及使用 ctr 命令或其他方式来检索容器的详细信息。这里假定你已经具备…

MOS开关电路应用于降低静态功耗

本文主要讲述MOS开关电路的应用,过了好久突然想整理一下&#xff0c;有错误的地方请多多指出&#xff0c;在做电池类产品&#xff0c;需要控制产品的静态功耗&#xff0c;即使让芯片进入休眠状态&#xff0c;依旧功率很大&#xff0c;所以在电路中加一组软开关&#xff0c;防止…

HTML静态网页成品作业(HTML+CSS)—— 零食商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

LeetCode 230.二叉搜索树中第K小的元素

各位看官们&#xff0c;大家好啊&#xff0c;今天这个题我用的方法时间复杂度比较高&#xff0c;但也是便于便于理解的一种方法&#xff0c;大家如果觉得的好的话&#xff0c;就给个免费的赞吧,谢谢大家了^ _ ^ 题目要求如图所示: 题目步骤&#xff1a; 1.我们可以一维数组来接…

使用Unsloth微调Llama3-Chinese-8B-Instruct中文开源大模型

微调Llama3-Chinese-8B-Instruct 微调是指在大规模预训练的基础模型上,使用特定领域或任务数据集进行少量迭代训练,以调整模型参数,提升其在特定任务上的表现。这种方法可以充分利用预训练模型的广泛知识,同时针对特定应用进行优化,达到更精准高效的效果。 Llama-3-Chinese-8B-…

刷题记录(240613)

aliyun0512 1. 小红定义一个数组是好数组&#xff0c;当且仅当所有奇数出现了奇数次&#xff0c;所有偶数出现了偶数次。现在小红拿到了一个数组&#xff0c;她希望取一个该数组的非空子序列(可以不连续)&#xff0c;使得子序列是好数组。你能帮小红求出子序列的方案数吗?由于…

【超详细】使用RedissonClient实现Redis分布式锁

使用RedissonClient实现Redis分布式锁是一个非常简洁和高效的方式。Redisson是一个基于Redis的Java客户端&#xff0c;它提供了许多高级功能&#xff0c;包括分布式锁、分布式集合、分布式映射等&#xff0c;简化了分布式系统中的并发控制。 添加依赖 首先&#xff0c;你需要…

mysql社区版有可以双机吗

MySQL社区版确实支持双机配置&#xff0c;以实现数据的冗余、备份和负载均衡等功能。以下是关于MySQL双机配置的一些关键点和步骤&#xff1a; 1. 双机热备的概念 双机热备是指保持两个数据库的状态自动同步&#xff0c;对任何一个数据库的操作都会自动应用到另一个数据库&am…

【深度学习】stable-diffusion-3,SD3生图体验

stabilityai/stable-diffusion-3-medium 代码地址&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-3-medium 可在这里体验&#xff1a; https://huggingface.co/spaces/ameerazam08/SD-3-Medium-GPU

并查集C++

并查集的原理 并查集&#xff08;Union-Find Set&#xff09;。可以把每个连通分量看成一个集合&#xff0c;该集合包含了连通分量中的所有点。这些点两两连通&#xff08;连通性&#xff09;&#xff0c;而具体的连通方式无关紧要&#xff0c;就好比集合中的元素没有先后顺序之…

git-本地项目与git连接及上传【快速教程】

1. 本地项目新建上传 打开我们的项目&#xff0c;此时项目中是没有 .git 文件的在你的项目文件夹里面【鼠标右击】弹出菜单在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】在命令窗口中输入&#xff1a;git init在 Gitee 中 我们刚刚新建的仓库里&#xff0c;去…

【ARM Cache 及 MMU 系列文章 1.3 -- 如何判断 L2 Cache 是否实现?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 CPU Configuration Register代码实现CPU Configuration Register 在 Armv9 架构中,我们可以通过arm 提供的自定义寄存器IMP_CPUCFR_EL1 来判断当前系统中是否实现了 L2 Cache, 如下所…

四六级翻译考前综合复习

翻译部分 东周时期 the Eastern Zhou Dynasty 南宋末年 the Late Southern Song Dynasty 早期/中期/末期 early/middle/late 3000多年前的中国西周 the Western Zhou Dynasty in/of China over 3,000 years ago 农历八月十五 on the 15th day of lunar Augest …

SpringBoot 实现 阿里云语音通知(SingleCallByTts)

目录 一、准备工作1.开通 阿里云语音服务2.申请企业资质3.创建语音通知模板&#xff0c;审核通过4.调用API接口---SingleCallByTts5.调试API接口---SingleCallByTts 二、代码实现1.导入依赖 com.aliyun:aliyun-java-sdk-dyvmsapi:3.0.22.创建工具类&#xff0c;用于发送语音通知…

我用AI绘画Stable Diffusion 一个月后,竟然能做出惊艳所有人的效果!

大家好&#xff0c;我是设计师阿威 如今要拍摄一组写真&#xff0c;需要服装、道具、灯光、场地、布景、拍摄、后期等过程。整个过程需要统一才能形成好的写真效果。现在有了AI绘图技术&#xff0c;我们可以实现通过AI绘图&#xff0c;只用计算机计算就得到一组接近真实的写真照…

什么是微前端

什么是微前端&#xff1f; 微前端 这个名词&#xff0c;第一次被提出还是在2016年底&#xff0c;那是在 ThoughtWorks Technology Radar。这个概念将微服务这个被广泛应用于服务端的技术范式扩展到前端领域。现代的前端应用的发展趋势正在变得越来越富功能化&#xff0c;富交互…

vue富文本wangeditor加@人功能(vue2 vue3都可以)

依赖 "wangeditor/editor": "^5.1.23", "wangeditor/editor-for-vue": "^5.1.12", "wangeditor/plugin-mention": "^1.0.0",RichEditor.vue <template><div style"border: 1px solid #ccc; posit…