leetcode 126 —— Word Ladder II
2015-08-12 11:21
471 查看
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 =
end =
dict =
Return
Note:
All words have the same length.
All words contain only lowercase alphabetic characters.
思路: 这道题目的难度简直令人发指。参考这里
class Solution {
public:
vector<vector<string>> res;
vector<string> tmpPath;
unordered_map<string, unordered_set<string>> path;
void generatePath(const string& start, string& end)
{
tmpPath.push_back(start);
if (start == end){
vector<string> tmp = tmpPath;
reverse(tmp.begin(), tmp.end());
res.push_back(tmp);
return;
}
for (auto index = path[start].begin(); index != path[start].end(); index++){
generatePath(*index, end);
tmpPath.pop_back();
}
}
vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
unordered_set<string> cur;
unordered_set<string> nex;
unordered_set<string> unvisited=dict;
if (unvisited.count(start) > 0)
unvisited.erase(start);
cur.insert(start);
while (cur.count(end) == 0 && !unvisited.empty()){
for (auto index = cur.begin(); index != cur.end(); index++){
string word = *index;
for (int i = 0; i < word.size(); i++){
for (int j = 0; j < 26; j++){
string tmp = word;
tmp[i] = 'a' + j;
if (unvisited.count(tmp)>0){
path[tmp].insert(word);
nex.insert(tmp);
}
}
}
}
if (nex.empty()) break;
for (auto index = nex.begin(); index != nex.end(); index++){
unvisited.erase(*index);
}
cur = nex;
nex.clear();
}
if (cur.count(end) > 0){
generatePath( end, start);
}
return res;
}
};
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>> res;
vector<string> tmpPath;
unordered_map<string, unordered_set<string>> path;
void generatePath(const string& start, string& end)
{
tmpPath.push_back(start);
if (start == end){
vector<string> tmp = tmpPath;
reverse(tmp.begin(), tmp.end());
res.push_back(tmp);
return;
}
for (auto index = path[start].begin(); index != path[start].end(); index++){
generatePath(*index, end);
tmpPath.pop_back();
}
}
vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
unordered_set<string> cur;
unordered_set<string> nex;
unordered_set<string> unvisited=dict;
if (unvisited.count(start) > 0)
unvisited.erase(start);
cur.insert(start);
while (cur.count(end) == 0 && !unvisited.empty()){
for (auto index = cur.begin(); index != cur.end(); index++){
string word = *index;
for (int i = 0; i < word.size(); i++){
for (int j = 0; j < 26; j++){
string tmp = word;
tmp[i] = 'a' + j;
if (unvisited.count(tmp)>0){
path[tmp].insert(word);
nex.insert(tmp);
}
}
}
}
if (nex.empty()) break;
for (auto index = nex.begin(); index != nex.end(); index++){
unvisited.erase(*index);
}
cur = nex;
nex.clear();
}
if (cur.count(end) > 0){
generatePath( end, start);
}
return res;
}
};
相关文章推荐
- 黑马程序员——多线程
- hdu 1709 求天平不能称重的重量 动态规划
- javascript后台运行效率是否比较低?
- Linux Socket
- HDU 5373(2015多校7)-The shortest problem(模拟%11)
- 用secureCRT通过SSH连接你的Linux(本文基于Ubuntu 10.04)
- C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring - 大新博客
- 关于HttpClient在服务器端使用请求碰到的问题总结
- POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
- UVa 10190 - Divide, But Not Quite Conquer!
- CSS 技术关键字
- jQuery实现动态添加和删除一个div
- iOS 8系统自带毛玻璃效果实现
- highcharts 圆柱图实时刷新Y轴
- js获取图片原始大小
- nagios
- malloc/free与new/delete的区别
- 数据结构-链式线性表(学习笔记)
- spring 常用注解