[leetcode] Word Ladder II
来源:互联网 发布:编程的思想与原则 编辑:程序博客网 时间:2024/05/16 16:06
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.
思路:
其实解题思路和Word Ladder完全一样,BFS,但是麻烦的是要返回所有的路径。
所以没办法,只能把每个单词所对应的前驱单词记录下来,当然有可能有多个,那么
就用一个vector<string>存储好,有这些记录就可以重构路径了。
参考链接:http://blog.csdn.net/niaokedaoren/article/details/8884938
代码:
class Solution {public: vector<vector<string> > findLadders(string start, string end, unordered_set<string> &dict) { // Start typing your C/C++ solution below // DO NOT write int main() function pathes.clear(); dict.insert(start);dict.insert(end);vector<string> prev;unordered_map<string, vector<string> > traces;for (unordered_set<string>::const_iterator citr = dict.begin(); citr != dict.end(); citr++) {traces[*citr] = prev;}vector<unordered_set<string> > layers(2);int cur = 0;int pre = 1;layers[cur].insert(start);while (true) {cur = !cur;pre = !pre;for (unordered_set<string>::const_iterator citr = layers[pre].begin();citr != layers[pre].end(); citr++)dict.erase(*citr);layers[cur].clear();for (unordered_set<string>::const_iterator citr = layers[pre].begin();citr != layers[pre].end(); citr++) {for (int n=0; n<(*citr).size(); n++) { string word = *citr; int stop = word[n] - 'a'; for (int i=(stop+1)%26; i!=stop; i=(i+1)%26) { word[n] = 'a' + i; if (dict.find(word) != dict.end()) { traces[word].push_back(*citr); layers[cur].insert(word); } } }} if (layers[cur].size() == 0) return pathes;if (layers[cur].count(end))break;}vector<string> path;buildPath(traces, path, end);return pathes;}private:void buildPath(unordered_map<string, vector<string> > &traces, vector<string> &path, const string &word) {if (traces[word].size() == 0) { path.push_back(word);vector<string> curPath = path;reverse(curPath.begin(), curPath.end());pathes.push_back(curPath); path.pop_back();return;}const vector<string> &prevs = traces[word];path.push_back(word);for (vector<string>::const_iterator citr = prevs.begin();citr != prevs.end(); citr++) {buildPath(traces, path, *citr);}path.pop_back();}vector<vector<string> > pathes;};
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
- maven 常用命令
- nova-scheduler详解 openstack-ice版
- hdu 4991 Ordered Subsequence(树状数组优化DP)
- linshi12
- NSOperationQueue VS GCD
- [leetcode] Word Ladder II
- 揭开Socket编程的面纱
- 交互设计师
- JAVA card 应用开发(九)APDU脚本命令中MAC的校验
- 类成员函数的重载、覆盖和隐藏区别?
- 《大话处理器》Cache一致性协议之MESI
- C++ 实现代理类
- leetcode Candy
- DLL 中 .def文件的使用