18. Word Ladder && Word Ladder II
Word Ladder
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence 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"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog"
, return its length 5
.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
思想:宽度优先搜索(BFS)即可。(可从头往尾部搜,也可从尾往头部搜,)。
我的方案中,使用两个 hash_set 分别存储当前层和下一层结点,另一个 hash_set存储之前遍历过的结点。
class Solution {
public:
int ladderLength(string start, string end, unordered_set<string> &dict) {
int ans = 0;
unordered_set<string> previousNodes;
vector<unordered_set<string> > node_levels(2);
int curLevel = 0; // which is index belong to vector node_levels.
node_levels[curLevel].insert(end);
ans++;
unordered_set<string>::iterator it;
while(!node_levels[curLevel].empty()) {
for(it = node_levels[curLevel].begin(); it != node_levels[curLevel].end(); ++it) {
for(size_t i = 0; i < it->size(); ++i) {
string node(*it);
for(node[i] = 'a'; node[i] <= 'z'; ++node[i]) {
if(node == start) return (ans+1); // output 1
if(previousNodes.count(node) || node_levels[curLevel].count(node) || node[i] == (*it)[i] || !dict.count(node))
continue;
node_levels[!curLevel].insert(node);
}
}
previousNodes.insert(*it);
}
node_levels[curLevel].clear();
curLevel = !curLevel;
ans++;
}
return 0; // output 2
}
};
Word Ladder II
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.
思想: 在 I 的基础之上, 加入 hash_map 记下每条边, 从 end 开始搜索,建立以 start 为源点,end 为汇点的图,然后从 start 开始深搜即可。
typedef pair<string, string> PAIR;
void getSolution(string &end, string& word, unordered_multimap<string, string> &map, vector<vector<string> > &vec, vector<string> &vec2) {
if(word == end) {
vec.push_back(vec2);
vec.back().push_back(word);
return;
}
pair<unordered_map<string, string>::iterator, unordered_map<string, string>::iterator> ret;
ret = map.equal_range(word);
while(ret.first != ret.second) {
vec2.push_back(ret.first->first);
getSolution(end, ret.first->second, map, vec, vec2);
vec2.pop_back();
ret.first++;
}
}
class Solution {
public:
vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
vector<vector<string>> vec;
unordered_multimap<string, string> edges;
unordered_set<string> previousNodes;
vector<unordered_set<string> > node_levels(2);
int curLevel = 0; // an index belong to vector node_levels
node_levels[curLevel].insert(end);
unordered_set<string>::iterator it;
while(!node_levels[curLevel].empty() && node_levels[curLevel].count(start) == 0) {
for(it = node_levels[curLevel].begin(); it != node_levels[curLevel].end(); ++it) {
for(size_t i = 0; i < it->size(); ++i) {
string node(*it);
for(node[i] = 'a'; node[i] <= 'z'; ++node[i]) {
if(node == start) {
node_levels[1-curLevel].insert(node);
edges.insert(PAIR(start, *it));
break;
}
if(previousNodes.count(node) || node_levels[curLevel].count(node) || dict.count(node) == 0)
continue;
node_levels[1-curLevel].insert(node);
edges.insert(PAIR(node, *it));
}
}
previousNodes.insert(*it);
}
node_levels[curLevel].clear();
curLevel = !curLevel;
}
previousNodes.clear();
if(node_levels[curLevel].empty()) return vec;
vector<string> vec2;
getSolution(end, start, edges, vec, vec2);
return vec;
}
};
18. Word Ladder && Word Ladder II的更多相关文章
- Microsoft.Office.Interop.Word 创建word
Microsoft.Office.Interop.Word 创建word 转载:http://www.cnblogs.com/chenbg2001/archive/2010/03/14/1685746 ...
- reverse the string word by word
题目:Given an input string, reverse the string word by word. For example,Given s = "the sky is bl ...
- LeetCode 5:Given an input string, reverse the string word by word.
problem: Given an input string, reverse the string word by word. For example: Given s = "the sk ...
- C#用Microsoft.Office.Interop.Word进行Word转PDF的问题
之前用Aspose.Word进行Word转PDF发现'\'这个字符会被转换成'¥'这样的错误,没办法只能换个方法了.下面是Microsoft.Office.Interop.Word转PDF的方法: p ...
- [CareerCup] 18.7 Longest Word 最长的单词
5.7 Given a list of words, write a program to find the longest word made of other words in the list. ...
- 17. Word Break && Word Break II
Word Break Given a string s and a dictionary of words dict, determine if s can be segmented into a s ...
- LeetCode之“动态规划”:Word Break && Word Break II
1. Word Break 题目链接 题目要求: Given a string s and a dictionary of words dict, determine if s can be seg ...
- leetcode@ [139/140] Word Break & Word Break II
https://leetcode.com/problems/word-break/ Given a string s and a dictionary of words dict, determine ...
- leetcode@ [79/140] Trie树应用 Word Search / Word Search II
https://leetcode.com/problems/word-search/ class Solution { public: struct Trie{ Trie *next[]; bool ...
随机推荐
- Java设计模式系列1--原型模式(Prototype Method)
2014-02-14 11:27:33 声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢! 原型模式,从名字即可看出,该模式的思想就是将一个对象作为原型, ...
- 《算法竞赛入门经典》5.41数学基础-Cantor的数表
如下数列,第一项是1/1,第二项是1/2,第三项是2/1,第四项是3/1,第五项是2/2,…….输入n,输出第n项.1/1 1/2 1/3 1/4 1/52/1 2/2 2/3 ...
- MySql指令集
http://blog.csdn.net/cl05300629/article/details/9464007
- hdu 1050 (preinitilization or postcleansing, std::fill) 分类: hdoj 2015-06-18 11:33 34人阅读 评论(0) 收藏
errors, clauses in place, logical ones, should be avoided. #include <cstdio> #include <cstr ...
- Python开发入门与实战8-基于Java的集成开发环境
8. 基于Java的Python的集成开发环境 目前为止我们所有的代码和例子都是通过Notepad文本编辑器来实现的,实际项目开发中这种编码模式效率较低(大虾除外),使用IDE集成开发环境常常大幅度的 ...
- scanf()读取带空格的字符串
#include <stdio.h> int main() { char str[128]; scanf( "%[^\n]", str ); printf( " ...
- hessionproxy
from pyhessian.client import HessianProxy if __name__ == '__main__': params = {"a": " ...
- C#异步批量下载文件
C#异步批量下载文件 实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果! 废话不多说,先看掩饰效果: 具体实现步骤如下: 1.新建项目:WinBatchDownload 2.先 ...
- Merge Intervals
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- viewPager动态加载listview数据
废话不多说,先上效果图.(代码见附件) 代码是修改自某大神的,我做了很多修改,之前只能向右滑动,现在可以左右无限滑动,只要数据没加载完就可以一直滑动.过程不算复杂,代码主要的地方都有注释. 附件dem ...