word ladder

2023-11-04 01:48
文章标签 word ladder

本文主要是介绍word ladder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:http://leetcode.com/onlinejudge#question_126

原题:

Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

Return

  [["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]

Note:

  • All words have the same length.
  • All words contain only lowercase alphabetic characters.

思路:

其实解题思路和Word Ladder完全一样,BFS,但是麻烦的是要返回所有的路径。

所以没办法,只能把每个单词所对应的前驱单词记录下来,当然有可能有多个,那么

就用一个vector<string>存储好,有这些记录就可以重构路径了。

代码:

[cpp]  view plain copy
  1. class Solution {  
  2. public:  
  3.     vector<vector<string> > findLadders(string start, string end, unordered_set<string> &dict) {  
  4.         // Start typing your C/C++ solution below  
  5.         // DO NOT write int main() function  
  6.         pathes.clear();  
  7.         dict.insert(start);  
  8.         dict.insert(end);  
  9.         vector<string> prev;  
  10.         unordered_map<string, vector<string> > traces;  
  11.         for (unordered_set<string>::const_iterator citr = dict.begin();   
  12.                 citr != dict.end(); citr++) {  
  13.             traces[*citr] = prev;  
  14.         }  
  15.           
  16.         vector<unordered_set<string> > layers(2);  
  17.         int cur = 0;  
  18.         int pre = 1;  
  19.         layers[cur].insert(start);  
  20.         while (true) {  
  21.             cur = !cur;  
  22.             pre = !pre;  
  23.             for (unordered_set<string>::const_iterator citr = layers[pre].begin();  
  24.                     citr != layers[pre].end(); citr++)  
  25.                 dict.erase(*citr);  
  26.             layers[cur].clear();  
  27.             for (unordered_set<string>::const_iterator citr = layers[pre].begin();  
  28.                     citr != layers[pre].end(); citr++) {  
  29.                 for (int n=0; n<(*citr).size(); n++) {    
  30.                     string word = *citr;    
  31.                     int stop = word[n] - 'a';    
  32.                     for (int i=(stop+1)%26; i!=stop; i=(i+1)%26) {    
  33.                         word[n] = 'a' + i;    
  34.                         if (dict.find(word) != dict.end()) {    
  35.                             traces[word].push_back(*citr);  
  36.                             layers[cur].insert(word);   
  37.                         }    
  38.                     }  
  39.                 }  
  40.             }  
  41.             if (layers[cur].size() == 0)  
  42.                 return pathes;  
  43.             if (layers[cur].count(end))  
  44.                 break;  
  45.         }  
  46.         vector<string> path;  
  47.         buildPath(traces, path, end);  
  48.   
  49.         return pathes;  
  50.     }  
  51.   
  52.     private:  
  53.         void buildPath(unordered_map<string, vector<string> > &traces,   
  54.                 vector<string> &path, const string &word) {  
  55.             if (traces[word].size() == 0) {  
  56.                 path.push_back(word);  
  57.                 vector<string> curPath = path;  
  58.                 reverse(curPath.begin(), curPath.end());  
  59.                 pathes.push_back(curPath);  
  60.                 path.pop_back();  
  61.                 return;  
  62.             }  
  63.   
  64.             const vector<string> &prevs = traces[word];  
  65.             path.push_back(word);  
  66.             for (vector<string>::const_iterator citr = prevs.begin();  
  67.                     citr != prevs.end(); citr++) {  
  68.                 buildPath(traces, path, *citr);  
  69.             }  
  70.             path.pop_back();  
  71.         }  
  72.   
  73.         vector<vector<string> > pathes;  
  74. };  

这篇关于word ladder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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#高效实现Word文档内容查找与替换的6种方法

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

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样