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

相关文章

C - Word Ladder题解

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

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

Excel和Word日常使用记录:

Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。按下快捷键 Alt + H,然后松开这些键。再按下 M,接着按 C。这个组合键执行的操作是:Alt + H:打开“主页”选项卡。M:选择“合并单元格”选项。C:执行“合并并居中”操作。 插入行: 在Excel中,插入一行的快捷键是:Windows:选择整行(可以点击行号)。按下 Ctrl + Sh

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式

【信创建设】信息系统信创建设整体技方案(word原件完整版)

信创,即“信息技术应用创新”。我国自主信息产业聚焦信息技术应用创新,旨在通过对IT硬件、软件等各个环节的重构,基于我国自有IT底层架构和标准,形成自有开放生态,从根本上解决本质安全问题,实现信息技术可掌控、可研究、可发展、可生产。信创发展是一项国家战略,也是当今形势下国家经济发展的新功能。信创产业发展已经成为各行各业数字化转型、提升产业链发展的关键。 软件全套资料部分文档清单: 工作安排任

.net MVC 导出Word--思路详解

序言:          一般在项目的开发过程中,总会接收到一个个需求,其中将数据转换成Work来下载,是一个很常见的需求;          那么,我们改如何处理这种需求,并输出实现呢?          在做的过程中,去思考 1、第一步:首先确认,Work的存在位置,并创建字符输出路:             //在的项目中创建一个存储work的文件夹             string

如何在Word中插入表格并进行高级格式化:冒号对齐、添加下划线并分栏

如何在Word中插入表格并进行高级格式化:详细教程 在Word中,表格是一个非常常用的工具,能够帮助我们更好地组织和展示信息。除此之外,本文还将深入探讨如何实现冒号对齐、添加专业的下划线以及隐藏表格线等高级技巧。通过这些技巧,能让你的文档更具美观性与专业性。 第一步:在Word页面上插入表格(大小为6行、2列) 插入表格 打开Word文档,将光标定位到想要插入表格的位置。点击菜单栏中的

Word快速重复上一步操作的三种高效方法

在日常工作、学习和生活中,我们经常需要执行一系列重复性的操作。这些操作可能简单如复制粘贴、调整图片大小,也可能复杂如编辑文档、处理数据等。为了提高效率,掌握快速重复上一步操作的方法显得尤为重要。本文将介绍三种高效的方法,帮助你在各种场景下迅速完成重复性任务。 方法1:利用“格式刷”功能 如果需要重复操作的是规范文本或段落的格式,很多人知道可以使用Word文档里的“格式刷”功能。 但点

199页Word智慧水务平台建设方案

业务需求分析 3.1 主要业务描述 (1)调度中心主要业务描述 配套工程调度中心为一级调度机构,同时也是水务集团原水供水的统一调度中心。 调度中心是配套工程全线水量调度的总负责单位,负责全线供水计划和调度计划的制定、工程技术管理、运行管理、水量监控、工程安全监测、水质监测、工程防洪、信息化系统管理、财务与资产管理、水费征收等。调度中心可对各现地站机电设备实现远程监控。 (2)分调中心主要

今天做了freemaker 导出word文档 的bug修复,解决 \n换行 问题

结合Freemaker导出文件 public void exportSimpleWord() throws Exception{// 要填充的数据, 注意map的key要和word中${xxx}的xxx一致Map<String,String> dataMap = new HashMap<String,String>();dataMap.put("username", "张三");dataMap.