回溯题目:单词接龙 II
文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目标题和出处标题单词接龙 II出处126. 单词接龙 II难度8 级题目描述要求字典wordList \texttt{wordList}wordList中从开始单词beginWord \texttt{beginWord}beginWord到结束单词endWord \texttt{endWord}endWord的转换序列是一个按下述规格形成的序列beginWord → s 1 → s 2 → … → s k \texttt{beginWord} \rightarrow \texttt{s}_\texttt{1} \rightarrow \texttt{s}_\texttt{2} \rightarrow \ldots \rightarrow \texttt{s}_\texttt{k}beginWord→s1​→s2​→…→sk​每一对相邻的单词只差一个字母。对于1 ≤ i ≤ k \texttt{1} \le \texttt{i} \le \texttt{k}1≤i≤k每个s i \texttt{s}_\texttt{i}si​都在wordList \texttt{wordList}wordList中。注意beginWord \texttt{beginWord}beginWord不需要在wordList \texttt{wordList}wordList中。s k endWord \texttt{s}_\texttt{k} \texttt{endWord}sk​endWord给定两个单词beginWord \texttt{beginWord}beginWord和endWord \texttt{endWord}endWord以及一个字典wordList \texttt{wordList}wordList返回所有从beginWord \texttt{beginWord}beginWord到endWord \texttt{endWord}endWord的最短转换序列。如果不存在这样的转换序列返回空列表。每个序列都应该以单词列表[beginWord, s 1 , s 2 , … , s k ] \texttt{[beginWord, s}_\texttt{1}\texttt{, s}_\texttt{2}\texttt{, }\ldots\texttt{, s}_\texttt{k}\texttt{]}[beginWord, s1​, s2​,…, sk​]的形式返回。示例示例 1输入beginWord hit, endWord cog, wordList [hot,dot,dog,lot,log,cog] \texttt{beginWord hit, endWord cog, wordList [hot,dot,dog,lot,log,cog]}beginWord hit, endWord cog, wordList [hot,dot,dog,lot,log,cog]输出[[hit,hot,dot,dog,cog],[hit,hot,lot,log,cog]] \texttt{[[hit,hot,dot,dog,cog],[hit,hot,lot,log,cog]]}[[hit,hot,dot,dog,cog],[hit,hot,lot,log,cog]]解释存在2 \texttt{2}2种最短的转换序列hit → hot → dot → dog → cog \texttt{hit} \rightarrow \texttt{hot} \rightarrow \texttt{dot} \rightarrow \texttt{dog} \rightarrow \texttt{cog}hit→hot→dot→dog→coghit → hot → lot → log → cog \texttt{hit} \rightarrow \texttt{hot} \rightarrow \texttt{lot} \rightarrow \texttt{log} \rightarrow \texttt{cog}hit→hot→lot→log→cog示例 2输入beginWord hit, endWord cog, wordList [hot,dot,dog,lot,log] \texttt{beginWord hit, endWord cog, wordList [hot,dot,dog,lot,log]}beginWord hit, endWord cog, wordList [hot,dot,dog,lot,log]输出[] \texttt{[]}[]解释结束单词cog \texttt{cog}cog不在字典中所以不存在有效的转换序列。数据范围1 ≤ beginWord.length ≤ 5 \texttt{1} \le \texttt{beginWord.length} \le \texttt{5}1≤beginWord.length≤5endWord.length beginWord.length \texttt{endWord.length} \texttt{beginWord.length}endWord.lengthbeginWord.length1 ≤ wordList.length ≤ 500 \texttt{1} \le \texttt{wordList.length} \le \texttt{500}1≤wordList.length≤500wordList[i].length beginWord.length \texttt{wordList[i].length} \texttt{beginWord.length}wordList[i].lengthbeginWord.lengthbeginWord \texttt{beginWord}beginWord、endWord \texttt{endWord}endWord和wordList[i] \texttt{wordList[i]}wordList[i]由小写英语字母组成beginWord ≠ endWord \texttt{beginWord} \ne \texttt{endWord}beginWordendWordwordList \texttt{wordList}wordList中的所有字符串各不相同所有最短转换序列的长度之和不超过10 5 \texttt{10}^\texttt{5}105解法思路和算法这道题是「单词接龙」的进阶要求计算所有从beginWord \textit{beginWord}beginWord到endWord \textit{endWord}endWord的最短转换序列。需要首先判断转换序列是否存在当转换序列存在时再生成所有的最短转换序列。为了快速判断一个单词是否在字典中需要使用哈希集合存储字典中的每个单词。只有当endWord \textit{endWord}endWord在字典中时才可能存在从beginWord \textit{beginWord}beginWord到endWord \textit{endWord}endWord的转换序列因此首先判断endWord \textit{endWord}endWord是否在字典中如果endWord \textit{endWord}endWord不在字典中则不存在从beginWord \textit{beginWord}beginWord到endWord \textit{endWord}endWord的转换序列返回空列表。以下只考虑endWord \textit{endWord}endWord在字典中的情况。判断转换序列是否存在可以使用广度优先搜索实现当转换序列存在时广度优先搜索可以确保得到最短转换序列。广度优先搜索的过程中需要使用哈希集合存储已访问的单词。初始时将beginWord \textit{beginWord}beginWord添加到已访问的哈希集合将beginWord \textit{beginWord}beginWord入队列。为了生成所有的最短转换序列广度优先搜索的过程中需要记录最短转换序列中的相邻单词之间的关系。具体做法是使用两个哈希表分别记录每个单词所在的层数和每个单词的前驱单词集合两个哈希表分别为层数哈希表和前驱哈希表。规定beginWord \textit{beginWord}beginWord在第1 11层从beginWord \textit{beginWord}beginWord开始遍历每次遍历同一层的全部单词并得到下一层的全部单词。记当前层为level \textit{level}level对于当前层的每个单词word \textit{word}word执行如下操作。如果word endWord \textit{word} \textit{endWord}wordendWord则找到转换序列结束广度优先搜索。如果word ≠ endWord \textit{word} \ne \textit{endWord}wordendWord则执行后续操作。得到word \textit{word}word的所有相邻单词对于每个相邻单词adjacent \textit{adjacent}adjacent执行如下操作。如果adjacent \textit{adjacent}adjacent在层数哈希表中存在且对应层数为level 1 \textit{level} 1level1则adjacent \textit{adjacent}adjacent为word \textit{word}word的后继单词word \textit{word}word为adjacent \textit{adjacent}adjacent的前驱单词将word \textit{word}word添加到adjacent \textit{adjacent}adjacent的前驱单词集合中。否则如果adjacent \textit{adjacent}adjacent在字典中且尚未加入已访问的哈希集合则将adjacent \textit{adjacent}adjacent加入已访问的哈希集合将adjacent \textit{adjacent}adjacent和对应层数level 1 \textit{level} 1level1添加到层数哈希表将word \textit{word}word添加到adjacent \textit{adjacent}adjacent的前驱单词集合中将adjacent \textit{adjacent}adjacent入队列。如果遍历结束仍未发现endWord \textit{endWord}endWord则不存在转换序列。当存在转换序列时从endWord \textit{endWord}endWord开始回溯得到所有的最短转换序列。用word \textit{word}word表示当前单词从前驱哈希表得到word \textit{word}word的所有前驱单词对于每个前驱单词执行回溯每次遇到beginWord \textit{beginWord}beginWord时即得到一个从endWord \textit{endWord}endWord到beginWord \textit{beginWord}beginWord的最短转换序列将该序列反转之后得到一个从beginWord \textit{beginWord}beginWord到endWord \textit{endWord}endWord的最短转换序列。代码classSolution{ListListStringladdersnewArrayListListString();StringbeginWord;intwordLength;MapString,SetStringprevMapnewHashMapString,SetString();ListStringtempnewArrayListString();publicListListStringfindLadders(StringbeginWord,StringendWord,ListStringwordList){SetStringwordSetnewHashSetString();for(Stringword:wordList){wordSet.add(word);}if(!wordSet.contains(endWord)){returnladders;}this.beginWordbeginWord;this.wordLengthbeginWord.length();booleanfoundbfs(beginWord,endWord,wordSet);if(found){backtrack(endWord);}returnladders;}publicbooleanbfs(StringbeginWord,StringendWord,SetStringwordSet){SetStringvisitednewHashSetString();visited.add(beginWord);MapString,IntegerlevelMapnewHashMapString,Integer();levelMap.put(beginWord,1);QueueStringqueuenewArrayDequeString();queue.offer(beginWord);intlevel0;while(!queue.isEmpty()){level;intsizequeue.size();for(inti0;isize;i){Stringwordqueue.poll();if(word.equals(endWord)){returntrue;}ListStringadjacentWordsgetAdjacentWords(word);for(Stringadjacent:adjacentWords){if(levelMap.getOrDefault(adjacent,0)level1){prevMap.get(adjacent).add(word);}elseif(wordSet.contains(adjacent)visited.add(adjacent)){levelMap.put(adjacent,level1);prevMap.put(adjacent,newHashSetString());prevMap.get(adjacent).add(word);queue.offer(adjacent);}}}}returnfalse;}publicListStringgetAdjacentWords(Stringword){ListStringadjacentWordsnewArrayListString();char[]arrword.toCharArray();for(inti0;iwordLength;i){charoriginalarr[i];for(charca;cz;c){if(coriginal){continue;}arr[i]c;adjacentWords.add(newString(arr));}arr[i]original;}returnadjacentWords;}publicvoidbacktrack(Stringword){temp.add(word);if(word.equals(beginWord)){ListStringladdernewArrayListString(temp);Collections.reverse(ladder);ladders.add(ladder);}else{SetStringprevWordsprevMap.get(word);for(Stringprev:prevWords){backtrack(prev);}}temp.remove(temp.size()-1);}}复杂度分析时间复杂度O ( ∣ Σ ∣ × m × n m × L ) O(|\Sigma| \times m \times n m \times L)O(∣Σ∣×m×nm×L)其中Σ \SigmaΣ是字符集m mm是单词的长度n nn是字典的大小L LL是所有最短转换序列的长度之和这道题中Σ \SigmaΣ是全部小写英语字母∣ Σ ∣ 26 |\Sigma| 26∣Σ∣26。广度优先搜索最多需要遍历每个单词一次对于每个单词计算其下一层的单词的时间是O ( ∣ Σ ∣ × m ) O(|\Sigma| \times m)O(∣Σ∣×m)因此时间复杂度是O ( ∣ Σ ∣ × m × n ) O(|\Sigma| \times m \times n)O(∣Σ∣×m×n)。回溯时对于最短转换序列中的每个单词的操作时间是O ( m ) O(m)O(m)因此时间复杂度是O ( m × L ) O(m \times L)O(m×L)。总时间复杂度是O ( ∣ Σ ∣ × m × n m × L ) O(|\Sigma| \times m \times n m \times L)O(∣Σ∣×m×nm×L)。空间复杂度O ( m × n ) O(m \times n)O(m×n)其中m mm是单词的长度n nn是字典的大小。哈希集合、哈希表和队列需要O ( m × n ) O(m \times n)O(m×n)的空间。注意返回值不计入空间复杂度。

相关新闻

告别失真与延迟!2024年唯一支持实时GPU加速的AI音频引擎曝光(内测资格仅剩83席)

告别失真与延迟!2024年唯一支持实时GPU加速的AI音频引擎曝光(内测资格仅剩83席)

更多请点击: https://intelliparadigm.com 第一章:AI音频处理工具推荐 近年来,AI驱动的音频处理工具在语音增强、音乐分离、语音转文字、音效生成等场景中展现出强大能力。以下工具均经过实际测试,兼顾开源友好性、API稳定性与本…

2026/7/23 17:59:23 阅读更多 →
每天省下2.4小时的AI办公组合拳:微软Power Automate×钉钉智能体×本地化知识库(限免调试包仅开放72小时)

每天省下2.4小时的AI办公组合拳:微软Power Automate×钉钉智能体×本地化知识库(限免调试包仅开放72小时)

更多请点击: https://intelliparadigm.com 第一章:AI办公自动化的核心价值与落地瓶颈 AI办公自动化正从概念验证快速迈向规模化应用,其核心价值在于重构人机协作范式——将重复性高、规则明确、跨系统协同频繁的办公任务交由AI代理持续执行&…

2026/7/23 17:59:23 阅读更多 →
随身wifi刷openwrt变软路由--103s没网的解决

随身wifi刷openwrt变软路由--103s没网的解决

1. 刷入openwrt系统前,在备份文件里面找到下面四个文件,解压出来,将后缀改为.bin,放入openwrt系统包.2. 将备份文件image目录下文件夹解压出来,传入棒子,重启,即可.

2026/7/23 17:59:23 阅读更多 →

最新新闻

大模型对话界面的流式渲染引擎:SSE 到 Markdown 的实时管道

大模型对话界面的流式渲染引擎:SSE 到 Markdown 的实时管道

大模型对话界面的流式渲染引擎:SSE 到 Markdown 的实时管道 一、SSE 长连接:为什么选它不选 WebSocket 对话产品要的是"模型生成 → 客户端消费"的单向推送。WebSocket 是双向通道,对纯对话场景能力过剩,还得自己管心跳…

2026/7/23 18:12:27 阅读更多 →
全新AU-48降噪模组:一芯解决六大音频痛点

全新AU-48降噪模组:一芯解决六大音频痛点

破解设备音频行业核心痛点 做对讲、会议、车载、安防、智能穿戴设备研发,你是否常年被音频难题困扰? 户外风噪、空调风扇轰鸣、车辆鸣笛、机械敲击杂音盖过人声;设备喇叭与麦克风距离近,开大音量就啸叫、回音刺耳;全双…

2026/7/23 18:12:27 阅读更多 →
树莓派玩转openwrt软路由:3.烧录OpenWrt固件至树莓派

树莓派玩转openwrt软路由:3.烧录OpenWrt固件至树莓派

1、获取OpenWrt固件前面介绍到了如何进行编译属于自己的固件,你可以选择自己编译好的固件也可以选择官方的固件,初学者推荐官方固件。进入OpenWrt官方网站:https://OpenWrt.org/方式一:下载设备的固件映像(固件选择器&…

2026/7/23 18:12:27 阅读更多 →
成本降62%,响应快4.8倍,客户满意度升37%:AI智能体客服系统规模化落地的12个关键决策点

成本降62%,响应快4.8倍,客户满意度升37%:AI智能体客服系统规模化落地的12个关键决策点

更多请点击: https://codechina.net 第一章:AI智能体客服系统规模化落地的价值跃迁 当单点AI客服模块升级为可编排、可协同、可演进的智能体系统,并在万级并发、千场景覆盖、百业务线联动的规模下稳定运行时,价值逻辑发生根本性重…

2026/7/23 18:12:27 阅读更多 →
ARM Cortex-M系统控制寄存器实战:软件复位与时钟门控详解

ARM Cortex-M系统控制寄存器实战:软件复位与时钟门控详解

1. 项目概述与核心价值 在嵌入式开发,尤其是基于ARM Cortex-M内核的微控制器项目中,我们常常会遇到两个看似简单却至关重要的需求:如何在不重启整个系统的情况下,让某个“卡死”的外设(比如UART串口)恢复正…

2026/7/23 18:12:27 阅读更多 →
深入解析Tiva™微控制器复位机制:从原理到实战的嵌入式系统稳定性设计

深入解析Tiva™微控制器复位机制:从原理到实战的嵌入式系统稳定性设计

1. 微控制器复位机制:系统稳定性的基石 在嵌入式系统开发中,尤其是工业控制、汽车电子或物联网设备这类对可靠性要求极高的领域,我们常常把注意力集中在功能实现、算法优化和性能调优上。然而,一个经常被新手甚至部分有经验的开发…

2026/7/23 18:11:27 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻