LeetCode //C++ - 126. Word Ladder II

2024-05-27 13:52
文章标签 leetcode c++ ii word 126 ladder

本文主要是介绍LeetCode //C++ - 126. Word Ladder II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

126. Word Ladder II

A transformation sequence from word beginWord to word endWord using a dictionary wordList is a sequence of words beginWord -> s 1 s_1 s1 -> s 2 s_2 s2 -> … -> s k s_k sk such that:

  • Every adjacent pair of words differs by a single letter.
  • Every s i s_i si for 1 <= i <= k is in wordList. Note that beginWord does not need to be in wordList.
  • sk == endWord

Given two words, beginWord and endWord, and a dictionary wordList, return all the shortest transformation sequences from beginWord to endWord, or an empty list if no such sequence exists. Each sequence should be returned as a list of the words [beginWord, s 1 s_1 s1, s 2 s_2 s2, …, s k s_k sk].
 

Example 1:

Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
Output:[[“hit”,“hot”,“dot”,“dog”,“cog”],[“hit”,“hot”,“lot”,“log”,“cog”]]
Explanation: There are 2 shortest transformation sequences:
“hit” -> “hot” -> “dot” -> “dog” -> “cog”
“hit” -> “hot” -> “lot” -> “log” -> “cog”+

Example 2:

Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”]
Output:[]
Explanation: The endWord “cog” is not in wordList, therefore there is no valid transformation sequence.

Constraints:
  • 1 <= beginWord.length <= 5
  • endWord.length == beginWord.length
  • 1 <= wordList.length <= 500
  • wordList[i].length == beginWord.length
  • beginWord, endWord, and wordList[i] consist of lowercase English letters.
  • beginWord != endWord
  • All the words in wordList are unique.
  • The sum of all shortest transformation sequences does not exceed 1 0 5 10^5 105.

From: LeetCode
Link: 126. Word Ladder II


Solution:

Ideas:
  • Initialization: An unordered set is used to quickly check if a word is in the dictionary (dict). A queue (q) manages the BFS starting with beginWord.
  • BFS Loop: The BFS iteratively transforms each character of the current word to explore all possible one-letter transformations. If these transformed words are in dict, they’re added to the queue for further exploration. parents keeps track of each word’s predecessors in the path.
  • Backtracking Function: Once the shortest paths are identified (found is true), the buildPaths function reconstructs the paths from endWord to beginWord using the parents map and accumulates them in ladders.
  • Handling Level-wise Exploration: visitedThisLevel prevents revisiting words in the same BFS level, optimizing the search and avoiding redundant paths.
Code:
class Solution {
public:vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {unordered_set<string> dict(wordList.begin(), wordList.end());vector<vector<string>> ladders;unordered_map<string, vector<string>> parents;queue<string> q;q.push(beginWord);bool found = false;while (!q.empty() && !found) {int levelSize = q.size();unordered_set<string> visitedThisLevel; // To handle duplicates in the current BFS levelfor (int i = 0; i < levelSize; ++i) {string currentWord = q.front();q.pop();string originalWord = currentWord; // Save the original word// Transform each character of the word to find all possible transformationsfor (char& ch : currentWord) {char originalChar = ch; // Save the original characterfor (ch = 'a'; ch <= 'z'; ++ch) {if (ch == originalChar) continue;if (dict.find(currentWord) != dict.end()) {if (currentWord == endWord) {found = true;}if (!found && visitedThisLevel.insert(currentWord).second) {q.push(currentWord);}parents[currentWord].push_back(originalWord);}}ch = originalChar; // Restore the original character}}// Remove visited words of this level from the dictionary to prevent going backwards in BFSfor (const string& word : visitedThisLevel) {dict.erase(word);}}if (found) {vector<string> path;buildPaths(endWord, beginWord, parents, path, ladders);}return ladders;}private:void buildPaths(const string& word, const string& beginWord,unordered_map<string, vector<string>>& parents,vector<string>& path, vector<vector<string>>& ladders) {if (word == beginWord) {path.push_back(word);vector<string> currentPath = path;reverse(currentPath.begin(), currentPath.end());ladders.push_back(currentPath);path.pop_back();return;}path.push_back(word);for (const string& parent : parents[word]) {buildPaths(parent, beginWord, parents, path, ladders);}path.pop_back();}
};

这篇关于LeetCode //C++ - 126. Word Ladder II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007659

相关文章

python在word中插入目录和更新目录实现方式

《python在word中插入目录和更新目录实现方式》文章主要介绍了如何在Word文档中插入和更新目录,并提供了具体的代码示例,插入目录时,需要使用`TablesOfContents`对象,并设置使用... 目录1、插入目录2、更新目录总结1、插入目录需要用到对象:TablesOfContents目录的

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局