LeetCode OJ-- Word Ladder II ***@
https://oj.leetcode.com/problems/word-ladder-ii/
啊,终于过了
class Solution {
public:
vector<vector<string> > findLadders(string start, string end, unordered_set<string> &dict) {
vector<vector<string> > ans;
if(start.size() == || end.size() == || dict.size() == )
return ans;
if(start == end)
{
vector<string> piece;
piece.push_back(start);
ans.push_back(piece);
return ans;
}
unordered_map<string, vector<string> > parents;
unordered_set<string> current;
current.insert(start);
dict.erase(start);
unordered_set<string> next;
bool flagFind = false;
vector<string> lastOnes; // 记录最后一个变换的string
int depth = ; // 记录深度
while(current.size() != && flagFind == false) // flagFind 标记是否已经找到
{
depth++;
// 对于本层的每一个单词
unordered_set<string>::iterator itr;
for(itr = current.begin(); itr != current.end(); itr++)
{
// 对于本单词的每一个位置
for(int index = ; index < start.size(); index++)
{
// 替换成 a~z,并且不等于原单词,并且在dict中存在
for(char ch = 'a'; ch <= 'z'; ch++)
{
string newStr = *itr;
if(newStr[index] != ch) // 换了以后不是原来的那个
{
newStr[index] = ch;
if(newStr == end)
{
lastOnes.push_back( *itr);
flagFind = true;
}
}
else
continue;
// 如果变换后在 dict 里面
if(dict.find(newStr) != dict.end())
{
next.insert(newStr);
// record parents
parents[newStr].push_back( *itr);
}
}
}
}
// remove all next strings from dict
for(itr = next.begin(); itr != next.end(); itr++)
dict.erase(*itr);
current = next;
next.clear();
}
if(flagFind == true)
{
vector<string> ansPiece;
ansPiece.push_back(end);
buildPath(ans,lastOnes,ansPiece,parents,depth);
}
return ans;
}
void buildPath(vector<vector<string> > &ans,vector<string> &lastOnes, vector<string> &ansPiece, unordered_map<string,vector<string> > &parents,int depth)
{
depth--;
for(int i = ; i < lastOnes.size(); i++)
{
ansPiece.push_back(lastOnes[i]);
if(depth == )
{
vector<string> temp = ansPiece;
reverse(temp.begin(),temp.end());
ans.push_back(temp);
}
else
{
buildPath(ans,parents[lastOnes[i]],ansPiece,parents,depth);
}
ansPiece.pop_back();
}
}
};
LeetCode OJ-- Word Ladder II ***@的更多相关文章
- [Leetcode Week5]Word Ladder II
Word Ladder II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder-ii/description/ Descripti ...
- 【leetcode】Word Ladder II
Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...
- Java for LeetCode 126 Word Ladder II 【HARD】
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...
- [LeetCode] 126. Word Ladder II 词语阶梯 II
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
- LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)
题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...
- [LeetCode] 126. Word Ladder II 词语阶梯之二
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
- [Leetcode][JAVA] Word Ladder II
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...
- [LeetCode#128]Word Ladder II
Problem: Given two words (start and end), and a dictionary, find all shortest transformation sequenc ...
- LeetCode OJ——Word Ladder
http://oj.leetcode.com/problems/word-ladder/ 图的最短路径问题,可以用最短路径算法,也可以深搜,也可以广搜. 深搜版本: 第一次写的时候,把sum和visi ...
- leetcode 126. Word Ladder II ----- java
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
随机推荐
- maven部署tomcat项目,403错误解决
maven部署tomcat项目时403错误的解决方法 web模块的pom文件 pom.xml <plugin> <groupId>org.apache.tomcat.maven ...
- adb devices offline 问题大总结
遇到doc对话框中adb devices ,一直显示设备处于offline状态,各种搜后安装所谓的: 1.开启usb调试模式2.关闭第三方手机助手软件3.重启adb服务 adb kill-ser ...
- oracle空表导出的问题
之前再做项目的时候下载了一个开源的程序,数据库在移植的时候通过exp/imp导入导出,结果程序在启动时报错,对比过后发现两个数据库表相差了十几个,再排查问题,发现少掉的十几个表全部是空表,查了一下or ...
- {POJ}{动态规划}{题目列表}
动态规划与贪心相关: {HDU}{4739}{Zhuge Liang's Mines}{压缩DP} 题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形 思路:背包问题,求出所有的正方形 ...
- c 数据拼接
char buf1[] = {0x31,0x32,0x33,0x00,0x51,0x52,0x53,0xaa,0xbb,0xcc,0x00}; int a=0xabcd6799; int b=0x88 ...
- LINUX下的拨号利器:wvdial和pppd —— 转载
wvdial是LINUX下的智能化拨号工具,利用wvdial和ppp可以实现linux下的轻松上网.在整个过程中wvdial的作用是拨号并等待提示,并根据提示输入相应的用户名和密码等认证信息:ppp的 ...
- BootLoader 详解(2)
BootLoader的stage1 1.基本的硬件初始化 这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境.它通 常包括以下 ...
- Xshell
http://baike.baidu.com/link?url=5lc5IxVVauitYSbqlOXJBvrvM3qVfMhzz6x_xu2cOMb108Ln9Wk7iJ3f46vG0kBninKw ...
- [python] python 中的" "和' '都是完全转义
dict = {"a" : "apple", "b" : "banana", "g" : " ...
- 【BZOJ2756】奇怪的游戏(二分,最小割)
题意: Blinker最近喜欢上一个奇怪的游戏.这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻的格子,并使这两个数都加上 1.现在 Blinker 想知道最 ...