LeetCode -- Word Ladder II
来源:互联网 发布:现代商友软件 编辑:程序博客网 时间:2024/05/16 01:21
在字典中搜索最短单词转换路径,
该题的关键有两点:
1)BFS遍历时需要逐层替换(不同层的单词不同,但同层可重复),这里使用2层交替;
2)使用hashmap记录当前单词与父节点单词的反向链接,在到达含有end单词的层后,反向遍历输出所有转换路径。
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:
- Only one letter can be changed at a time
- 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.
class Solution { void outputPath(vector<vector<string>> &res, vector<string> &path, unordered_map<string, vector<string> > &reverseLink, string end){ if(reverseLink[end].size() == 0){ vector<string> tmp = path; reverse(tmp.begin(), tmp.end()); res.push_back(tmp); } else { vector<string>::iterator it; for(it = reverseLink[end].begin(); it != reverseLink[end].end(); it++){ path.push_back(*it); outputPath(res, path, reverseLink, *it); path.pop_back(); } } }public: vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) { unordered_map<string, vector<string> > reverseLink; if(dict.find(end) == dict.end()) dict.insert(end); unordered_set<string> layer[2]; layer[0].insert(start); int cur = 0, next = 1, len = start.length(); while(!layer[cur].empty()){ if(reverseLink.find(end) != reverseLink.end()) break; unordered_set<string>::iterator it; for(it = layer[cur].begin(); it != layer[cur].end(); it++){ dict.erase(*it); } layer[next].clear(); for(it = layer[cur].begin(); it != layer[cur].end(); it++){ string p = *it; for(int j = 0; j < len; j++){ char c = p[j]; for(char k = 'a'; k <= 'z'; k++){ if(c == k) continue; p[j] = k; if(dict.find(p) != dict.end()){ layer[next].insert(p); reverseLink[p].push_back(*it); } } p[j] = c; } } cur = !cur; next = !next; } vector<vector<string>> res; if(reverseLink.find(end) == reverseLink.end()) return res; vector<string> path; path.push_back(end); outputPath(res, path, reverseLink, end); return res; }};
0 0
- 【leetcode】Word Ladder II
- [LeetCode]Word Ladder II
- [leetcode] Word Ladder II
- LeetCode - Word Ladder II
- Leetcode: Word Ladder II
- leetcode Word Ladder II
- Leetcode Word Ladder II
- LeetCode | Word Ladder II
- leetcode word ladder II
- 【Leetcode】Word Ladder II
- [LeetCode] Word Ladder II
- Word Ladder II -- LeetCode
- Leetcode: Word Ladder II
- leetcode-Word Ladder II
- leetcode-Word Ladder II
- leetcode: Word Ladder II
- leetcode Word Ladder II
- Leetcode: Word Ladder II
- web.xml 详细介绍
- error C2679
- 最小树形图 朱刘算法
- OpenVPN多处理之-最新架构
- opencv透视变换cvWarpPerspective实例
- LeetCode -- Word Ladder II
- Java网络基础之套接字
- Android基本组件——Activity详解
- linux安装配置LAMP环境
- CentOS配置smaba与Windows共享文件
- 问题复杂度
- XMPP学习笔记(一)
- 《数据结构》第二章线性表设计2:同学博客中问题求解
- 三极管的电平转换及驱动电路分析