LeetCode127:Word Ladder II
题目:
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:
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:
解题思路:
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <unordered_set>
#include <unordered_map>
#include <algorithm>
using namespace std; /**
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 {
public:
vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
vector<vector<string>> resvec;
if(start.empty() || end.empty() || dict.empty())
return resvec;
unordered_map<string, vector<string>> premap;
//这里需要用到两个vector来模拟两个队列而不是直接用两个队列,是因为需要对队列进行遍历,queue做不到
vector<string> squ[2];
squ[0].push_back(start);
bool qid = false;
bool finish = false;
while(!squ[qid].empty())
{
squ[!qid].clear();
vector<string>::iterator iter;
for(iter = squ[qid].begin(); iter != squ[qid].end(); ++iter)
dict.erase(*iter);//从dict中删除同一层的所有节点,以免造成循环操作
for(iter = squ[qid].begin(); iter != squ[qid].end(); ++iter)//处理同一层节点
{
string curstr = *iter;
for(int i = 0; i < curstr.size(); i++)
{
char t = curstr[i];
for(char j = 'a'; j <= 'z'; j++)
{
if(j == curstr[i])
continue;
curstr[i] = j;
if(curstr == end)
{
finish = true;
premap[curstr].push_back(*iter); }
else if(dict.count(curstr) > 0)
{
squ[!qid].push_back(curstr);
premap[curstr].push_back(*iter);
}
}
curstr[i] = t; }
}
if(finish)//说明已经处理到了end节点,可以直接break循环,进行结果重构了
break;
qid = !qid;//表示将要处理的下一层
}
if(premap.count(end) == 0)//表明end节点的父节点不存在,所有没有到end的转换,直接返回空resvec
return resvec;
vector<string> tmp;
getResult(resvec, tmp, premap, start, end);
return resvec;
} //DFS
void getResult(vector<vector<string> > &resvec, vector<string> &tmp,
unordered_map<string, vector<string> > &premap, string &start, string &cur)
{
tmp.push_back(cur);
if (cur == start)
{
resvec.push_back(tmp);
reverse(resvec.back().begin(), resvec.back().end());
}
else
{
vector<string> v = premap[cur];
for (int i = 0; i < v.size(); i++)
{
getResult(resvec, tmp, premap, start, v[i]);
}
}
tmp.pop_back();
}
}; int main(void)
{
string start("hit");
string end("cog");
string strarr[] = {"hot","dot","dog","lot","log"};
int n = sizeof(strarr) / sizeof(strarr[0]);
unordered_set<string> dict(strarr, strarr+n);
Solution solution;
vector<vector<string>> resvec = solution.findLadders(start, end, dict);
vector<vector<string>>::iterator iter;
for(iter = resvec.begin(); iter != resvec.end(); ++iter)
{
vector<string> tmp = *iter;
vector<string>::iterator it;
for(it = tmp.begin(); it != tmp.end(); ++it)
cout<<*it<<" ";
cout<<endl;
}
return 0;
}
以下附网上大神AC代码一份:
class Solution {
public:
vector<vector<string> > findLadders(string start, string end, unordered_set<string> &dict)
{
result_.clear();
unordered_map<string, vector<string>> prevMap;
for(auto iter = dict.begin(); iter != dict.end(); ++iter)
prevMap[*iter] = vector<string>();
vector<unordered_set<string>> candidates(2);
int current = 0;
int previous = 1;
candidates[current].insert(start);
while(true)
{
current = !current;
previous = !previous;
for (auto iter = candidates[previous].begin(); iter != candidates[previous].end(); ++iter)
dict.erase(*iter);
candidates[current].clear();
for(auto iter = candidates[previous].begin(); iter != candidates[previous].end(); ++iter)
{
for(size_t pos = 0; pos < iter->size(); ++pos)
{
string word = *iter;
for(int i = 'a'; i <= 'z'; ++i)
{
if(word[pos] == i)continue;
word[pos] = i;
if(dict.count(word) > 0)
{
prevMap[word].push_back(*iter);
candidates[current].insert(word);
}
}
}
}
if (candidates[current].size() == 0)
return result_;
if (candidates[current].count(end)) break;
}
vector<string> path;
GeneratePath(prevMap, path, end);
return result_;
}
private:
void GeneratePath(unordered_map<string, vector<string>> &prevMap, vector<string>& path, const string& word)
{
if (prevMap[word].size() == 0)
{
path.push_back(word);
vector<string> curPath = path;
reverse(curPath.begin(), curPath.end());
result_.push_back(curPath);
path.pop_back();
return;
}
path.push_back(word);
for (auto iter = prevMap[word].begin(); iter != prevMap[word].end(); ++iter)
GeneratePath(prevMap, path, *iter);
path.pop_back();
}
vector<vector<string>> result_;
};
代码来源:http://blog.csdn.net/doc_sgl/article/details/13341405
LeetCode127:Word Ladder II的更多相关文章
- 18. Word Ladder && Word Ladder II
Word Ladder Given two words (start and end), and a dictionary, find the length of shortest transform ...
- [leetcode]Word Ladder II @ Python
[leetcode]Word Ladder II @ Python 原题地址:http://oj.leetcode.com/problems/word-ladder-ii/ 参考文献:http://b ...
- LeetCode: Word Ladder II 解题报告
Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation s ...
- [Leetcode Week5]Word Ladder II
Word Ladder II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder-ii/description/ Descripti ...
- 126. Word Ladder II(hard)
126. Word Ladder II 题目 Given two words (beginWord and endWord), and a dictionary's word list, find a ...
- [LeetCode] Word Ladder II 词语阶梯之二
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...
- 【leetcode】Word Ladder II
Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...
- LeetCode :Word Ladder II My Solution
Word Ladder II Total Accepted: 11755 Total Submissions: 102776My Submissions Given two words (start ...
- [LeetCode] 126. Word Ladder II 词语阶梯之二
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
随机推荐
- ASP.NET 4.0 potentially dangerous Request.Form value was detected
A few days ago, while working on an ASP.NET 4.0 Web project, I got an issue. The issue was, when use ...
- 本博客停止更新,移至purecpp.org
声明:本博客停止更新,迁移至C++开源社区purecpp.org, 欢迎持续关注!
- 领域驱动开发推荐代码示例 — Microsoft NLayerApp
简介: Microsoft NLayerApp是由微软西班牙团队出品的基于.NET 4.0的“面向领域N层分布式架构”代码示例,在codeplex上的地址是:http://microsoftnlaye ...
- saiku 展示优化
saiku版本:3.7.4 下面是修改步骤,如果觉得麻烦,可以直接下载源代码:https://github.com/lihehuo/saiku 1.关闭自动执行 修改文件:saiku-ui/js/sa ...
- __declspec(dllimport)
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...
- MyEclipse自动生成hibernate实体类和配置文件攻略
步骤1:找到导航栏里面的window--showView然后输入db brower,打开数据库浏览窗口步骤2:在数据库浏览窗口里只有一个Myeclipse自带的数据库,该数据没有用,我们在空白的地方右 ...
- 生成证书时Distribution下面App Store and Ad Hoc 选项不能选择的原因及解决办法
出现这个问题的原因是:发布用的证书创建是有数量限制的,仅支持3个,所以把原先不用的证书Revoke掉就可以了
- Probabilistic Graphical Models
http://innopac.lib.tsinghua.edu.cn/search~S1*chx?/YProbabilistic+Graphical+Models&searchscope=1& ...
- win7左ctrl和左alt键互换
主要参考这篇文章: http://xyztony1985.blog.163.com/blog/static/3611782011752420104/ 感谢原博主 Windows Registry Ed ...
- smartjs 0.3 DataManager 发布&介绍
在0.3版加入了DataManager,基于策略的数据管理模块:是SmartJS中比较重要的一个系列.整个个DataManager模块包括有:dataManager,dataPolicyManager ...