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 ...
随机推荐
- mybatis.net insert 返回主键
mybatis insert语句 <insert id="Add" parameterClass="UserInfo" resultClass=" ...
- IT公司100题-27-跳台阶问题
问题描述: 一个台阶总共有n阶,一次可以跳1级或者2级.求总共有多少种跳法. 分析: 用f(n)表示n阶台阶总共有多少种跳法.n阶台阶,第一可以选择跳1阶或者2阶,则f(n) = f(n-1) + ...
- iOS webView 远程html加载本地资源
昨天,一个朋友让我帮他在IOS上弄这样一件事情: webView 调用远程URL,并且让远程的web 通过自定义标签能实现内嵌本地的图片.js 或音频等. 比如:在服务器端 的html文件中 这样写到 ...
- nslog一些用法
1.nslog打印方法出来 NSLog(@"%@",NSStringFromSelector(_cmd)); 2.debug模式下打印一些信息,release模式下则不打印 #if ...
- 系统不支持curl
解决安装pinphp时出现的“系统不支持curl!” 今天在本机安装phppin开源程序时,提示“系统不支持curl!”错误. 由于我本机是UBUNTU系统,所以直接通过apt-get进行安装. ...
- 黑马程序员——【Java基础】——GUI(图形用户界面)
---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.GUI(GraphicalUser Interface):又称图形用户界面,是计算机用户与计 ...
- GCD线程间通信
从子线程回到主线程 dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执 ...
- Unity Sprite转Prefab
新项目使用Unity5.X,遇到了一些问题,其中就有Sprite的管理更新问题,查了一些资料,Mono推荐的是转为Prefab处理. 看了一些国外同行的处理方法,分析了一个编辑器插件脚本.学到了一些技 ...
- 查看oracle当前session
怎样查看oracle当前的连接数呢?只需要用下面的SQL语句查询一下就可以了. #查看当前不为空的连接select * from v$session where username is not n ...
- day5--<装饰器、模块、字符串格式化、生成器、迭代器>logging模块
本节大纲: 一:双层装饰器:一个函数可以被多层装饰器进行装饰,函数渲染(编译)从下到上,函数执行从上到下.如下程序: #!/usr/bin/env python #-*-coding:utf-8-*- ...