LeetCode 127:单词接龙

LeetCode 127:单词接龙

在这里插入图片描述

问题本质:最短转换序列的长度

给定两个单词 beginWordendWord,以及字典 wordList,要求找到从 beginWordendWord最短转换序列(每次转换仅改变一个字母,且中间单词必须在 wordList 中),返回序列的单词数;若无法转换,返回 0

核心思路:广度优先搜索(BFS)

BFS 天然适合解决最短路径问题,因为它按层次遍历,第一次到达目标节点时的层数即为最短路径长度。

关键观察:
  1. 邻居生成:每个单词的“邻居”是改变一个字母后得到的所有可能单词(需在 wordList 中)。
  2. 去重处理:用集合记录已访问的单词,避免重复处理(否则会导致无限循环或超时)。

算法步骤详解

步骤 1:预处理与边界检查
  • wordList 转换为 HashSet,确保查找时间为 O(1)
  • endWord 不在 wordList 中,直接返回 0(无法转换)。
步骤 2:初始化 BFS
  • 队列:存储当前处理的单词及当前步数(通过分层遍历实现,队列中同一层的单词对应相同步数)。
  • 访问集合:记录已处理的单词,避免重复入队。
  • 初始状态:将 beginWord 入队,步数为 1beginWord 是序列的第一个单词)。
步骤 3:分层遍历(BFS 核心)
  1. 遍历当前层:每次取出队列中当前层的所有单词(通过 queue.size() 获取层大小)。
  2. 生成邻居:对每个单词,遍历其每个字符位置,尝试替换为 a-z 中除原字符外的所有可能,生成新单词。
  3. 检查终止条件:若新单词是 endWord,直接返回 当前步数 + 1(新单词是下一层,步数加1)。
  4. 合法邻居入队:若新单词在 wordList 中且未被访问,标记为已访问并加入队列。
步骤 4:处理剩余情况

若遍历完所有可能仍未找到 endWord,返回 0

完整代码(Java)

import java.util.*;class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {// 1. 预处理:转换为集合,加速查找Set<String> wordSet = new HashSet<>(wordList);// 边界检查:endWord 不在字典中,直接返回 0if (!wordSet.contains(endWord)) {return 0;}// 2. 初始化 BFS:队列(存储单词)、访问集合、步数Queue<String> queue = new LinkedList<>();Set<String> visited = new HashSet<>();queue.offer(beginWord);visited.add(beginWord);int step = 1; // beginWord 是第一个单词,步数初始为 1// 3. 分层遍历while (!queue.isEmpty()) {int currentLevelSize = queue.size(); // 当前层的单词数量for (int i = 0; i < currentLevelSize; i++) {String currentWord = queue.poll();// 生成所有可能的邻居(改变一个字母)for (int j = 0; j < currentWord.length(); j++) {// 尝试替换为 a-z 中除原字符外的所有字母for (char c = 'a'; c <= 'z'; c++) {if (c == currentWord.charAt(j)) {continue; // 跳过原字符,保证只改变一个字母}// 构造新单词StringBuilder sb = new StringBuilder(currentWord);sb.setCharAt(j, c);String newWord = sb.toString();// 终止条件:找到 endWord,返回步数+1if (newWord.equals(endWord)) {return step + 1;}// 合法邻居:在字典中且未被访问if (wordSet.contains(newWord) && !visited.contains(newWord)) {visited.add(newWord);queue.offer(newWord);}}}}step++; // 处理完当前层,步数加 1}// 4. 遍历结束仍未找到,返回 0return 0;}
}

关键细节解析

  1. 邻居生成优化
    对每个字符位置,遍历 26 个字母(跳过原字符),确保仅改变一个字母。时间复杂度为 O(L×26)L 是单词长度,最多为 10),高效可控。

  2. 分层遍历的意义
    通过 queue.size() 分层处理,保证每次处理的是同一步数的单词,确保第一次到达 endWord 时的步数是最小值

  3. 去重的必要性
    若不标记已访问,同一单词可能被多次入队,导致时间复杂度过高(例如,hot 可能被不同路径多次生成)。

复杂度分析

  • 时间复杂度O(N×L×26),其中 NwordList 的长度(最多 5000),L 是单词长度(最多 10)。每个单词生成 L×25 个邻居(排除原字符),整体可接受。
  • 空间复杂度O(N),队列和访问集合最多存储 N 个单词。

示例验证

示例 1

  • 输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
  • 过程:hit → hot → dot → dog → cog,共 5 步。代码中,当处理 dog 时生成 cog,返回 step + 1 = 4 + 1 = 5,符合预期。

示例 2

  • 输入:endWord 不在 wordList 中,直接返回 0

该方案通过 BFS 层次遍历 高效求解最短路径,利用集合优化查找和去重,确保了算法的正确性与性能,是处理“单词接龙”类问题的经典思路。

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

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

相关文章

docker搭建ray集群

1. 安装docker 已安装过docker 没安装流程 启动 Docker 服务&#xff1a; sudo systemctl start docker sudo systemctl enable docker # 设置开机即启动docker验证 Docker 是否安装成功&#xff1a; docker --version2. 部署ray # 先停止docker服务 systemctl stop docker…

【iOS】SideTable

文章目录前言1️⃣Side Table 的核心作用&#xff1a;扩展对象元数据存储1.1 传统对象的内存限制1.2 Side Table 的定位&#xff1a;集中式元数据仓库2️⃣Side Table 的底层结构与关联2.1 Side Table 与 isa 指针的关系2.2 Side Table 的存储结构2.3 SideTable 的工作流程3️⃣…

【Spring Cloud Gateway 实战系列】高级篇:服务网格集成、安全增强与全链路压测

一、服务网格集成&#xff1a;Gateway与Istio的协同作战在微服务架构向服务网格演进的过程中&#xff0c;Spring Cloud Gateway可与Istio形成互补——Gateway负责南北向流量&#xff08;客户端到集群&#xff09;的入口管理&#xff0c;Istio负责东西向流量&#xff08;集群内服…

一文说清楚Hive

Hive作为Apache Hadoop生态的核心数据仓库工具&#xff0c;其设计初衷是为熟悉SQL的用户提供大规模数据离线处理能力。以下从底层计算框架、优点、场景、注意事项及实践案例五个维度展开说明。 一、Hive底层分布式计算框架对比 Hive本身不直接执行计算&#xff0c;而是将HQL转换…

SeaweedFS深度解析(三):裸金属单机和集群部署

#作者&#xff1a;闫乾苓 文章目录2.2.4 S3 Server&#xff08;兼容 Amazon S3 的接口&#xff09;2.2.5 Weed&#xff08;命令行工具&#xff09;3、裸金属单机和集群部署3.1 裸金属单机部署3.1.1安装 SeaweedFS3.1.2 以Master模式启动2.2.4 S3 Server&#xff08;兼容 Amazon…

相机ROI 参数

相机的 ROI&#xff08;Region of Interest&#xff0c;感兴趣区域&#xff09; 参数&#xff0c;是指通过设置图像传感器上 特定区域 作为有效成像区域&#xff0c;从而只采集该区域的图像数据&#xff0c;而忽略其他部分。这一功能常用于工业相机、科研相机、高速相机等场景&…

Vue基础(24)_VueCompinent构造函数、Vue实例对象与组件实例对象

分析上一节代码中的school组件&#xff1a;该组件是一个名为VueCompinent的构造函数。截取部分vue.js源码&#xff0c;分析Vue.extend&#xff1a;// 定义一个名为VueComponent的构造函数对象Sub&#xff0c;往Sub对象调用_init(options)方法&#xff0c;参数为配置项&#xff…

萤石云替代产品摄像头方案萤石云不支持TCP本地连接-东方仙盟

不断试错东方仙盟深耕科研测评&#xff0c;聚焦前沿领域&#xff0c;以严谨标准评估成果&#xff0c;追踪技术突破&#xff0c;在探索与验证中持续精进&#xff0c;为科研发展提供参考&#xff0c;助力探路前行 萤石云价格萤石云的不便于使用 家庭场景&#xff1a;成本可控与隐…

C51:用DS1302时钟读取和设置时间

因为在ds1302.c文件中包含了写ds1302&#xff08;51向ds1302写数据&#xff09;和读ds1302&#xff08;51从ds1302读数据&#xff09;的两个函数&#xff0c;我们根据文件中提供的函数来写读取时间和设置时间的函数即可ds1302.c文件源码如下&#xff0c;需要的同学可以参考一下…

webrtc整体架构

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一套支持浏览器和移动应用进行实时音视频通信的开源技术标准&#xff0c;其架构设计围绕 “实时性”“低延迟”“跨平台” 和 “安全性” 展开&#xff0c;整体可分为核心引擎层、API 层、支撑服务层三大部分&…

浅析PCIe 6.0 ATS地址转换功能

在现代高性能计算和虚拟化系统中,地址转换(Address Translation)是一个至关重要的机制。随着 PCIe 设备(如 GPU、网卡、存储控制器)直接访问系统内存的能力增强,设备对虚拟内存的访问需求日益增长。 为了提升性能并确保安全访问,Address Translation Services(ATS) 应…

【前端】ikun-pptx编辑器前瞻问题二: pptx的压缩包结构,以及xml正文树及对应元素介绍

文章目录PPTX文件本质&#xff1a;一个压缩包核心文件解析1. 幻灯片内容文件 (ppt/slides/slideX.xml)2. 元素类型解析文本框元素 (p:sp)图片元素 (p:pic)单位系统开发注意事项参考工具pptx渲染路线图PPTX文件本质&#xff1a;一个压缩包 PPTX文件实际上是一个遵循Open XML标准…

分布式任务调度实战:XXL-JOB与Elastic-Job深度解析

告别传统定时任务的局限&#xff0c;拥抱分布式调度的强大与灵活 在现代分布式系统中&#xff0c;高效可靠的任务调度已成为系统架构的核心需求。面对传统方案&#xff08;如Timer、Quartz&#xff09;在分布式环境下的不足&#xff0c;开发者急需支持集群调度、故障转移和可视…

Windows 11下纯软件模拟虚拟机的设备模拟与虚拟化(仅终端和网络)

Windows 11下用GCC的C代码实现的虚拟机需要终端输入/输出&#xff08;如串口或虚拟控制台&#xff09;和网络连接&#xff0c;但不需要完整的硬件设备&#xff08;如磁盘、显卡、USB 等&#xff09;。在终端输入/输出方面&#xff0c;参考qemu的源代码&#xff0c;但不调用qemu…

CCF-GESP 等级考试 2025年6月认证Python六级真题解析

1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;第1题 下列哪一项不是面向对象编程&#xff08;OOP&#xff09;的基本特征&#xff1f;&#xff08; &#xff09;A. 继承 (Inheritance) B. 封装 (Encapsul…

C++中的deque

1. 什么是 Deque&#xff1f; 核心概念&#xff1a; Deque 是 “Double-Ended Queue”&#xff08;双端队列&#xff09;的缩写。你可以把它想象成一个可以在两端&#xff08;头部和尾部&#xff09;高效地进行添加或删除操作的线性数据结构。关键特性&#xff1a; 双端操作&am…

GNU到底是什么,与Unix和Linux是什么关系

GNU&#xff08;发音为 /ɡnuː/&#xff0c;类似“革奴”&#xff09;是一个自由软件操作系统项目&#xff0c;由理查德斯托曼&#xff08;Richard Stallman&#xff09;于1983年发起&#xff0c;目标是创建一个完全由自由软件组成的类Unix操作系统。它的名字是一个递归缩写&a…

双指针算法介绍及使用(下)

在上一篇文章中我们已经对双指针有了一定了解&#xff0c;接下来我们通过题目来对双指针进行更好的理解。 1. leetcode 202. 快乐数 这道题使用的方法是快慢指针&#xff0c; 比如说一个数X&#xff0c;那么创建两个变量X1和X2&#xff0c;然后X1每次变化两次&#xff0c;X2变化…

Elasticsearch整合:Repository+RestClient双模式查询优化

Elasticsearch整合&#xff1a;RepositoryRestClient双模式查询优化Elasticsearch 双模式查询优化&#xff1a;Repository RestClient 整合指南一、架构设计&#xff1a;双模式协同工作流二、Repository 模式&#xff1a;快速开发最佳实践2.1 基础配置2.2 高级特性&#xff1a…

Elasticsearch 高级查询语法 Query DSL 实战指南

目录 1、DSL 概述 1.1 DSL按照查询的结构层次划分 1.2 DSL按照检索功能的用途和特性划分 1.3 示例数据准备 2、match_all ——匹配所有文档 3、精确匹配 3.1 term——单字段精确匹配查询 3.2 terms——多值精确匹配 3.3 range——范围查询 3.4 exists——是否存在查询…