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

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样