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

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图