127. 126. Word Ladder *HARD* -- 单词每次变一个字母转换成另一个单词
127.
Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the word list
For example,
Given:
beginWord = "hit"
endWord = "cog"
wordList = ["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.
- class Solution {
- public:
- int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) {
- int l = beginWord.length(), n = wordList.size(), i;
- if(l <= || n <= || beginWord == endWord)
- return ;
- queue<string> q;
- q.push(beginWord);
- map<string, int> m;
- m[beginWord] = ;
- while(!q.empty())
- {
- string s = q.front();
- q.pop();
- for(i = ; i < l; i++)
- {
- for(char c = 'a'; c <= 'z'; c++)
- {
- string t = s;
- t[i] = c;
- if(wordList.find(t) != wordList.end() && m.find(t) == m.end())
- {
- m[t] = m[s] + ;
- if(t == endWord)
- return m[t];
- q.push(t);
- }
- }
- }
- }
- return ;
- }
- };
- // ---------------------------
- // BFS non-recursive method
- // ---------------------------
- //
- // Using BFS instead of DFS is becasue the solution need the shortest transformation path.
- //
- // So, we can change every char in the word one by one, until find all possible transformation.
- //
- // Keep this iteration, we will find the shorest path.
- //
- // For example:
- //
- // start = "hit"
- // end = "cog"
- // dict = ["hot","dot","dog","lot","log","dit","hig", "dig"]
- //
- // +-----+
- // +-------------+ hit +--------------+
- // | +--+--+ |
- // | | |
- // +--v--+ +--v--+ +--v--+
- // | dit | +-----+ hot +---+ | hig |
- // +--+--+ | +-----+ | +--+--+
- // | | | |
- // | +--v--+ +--v--+ +--v--+
- // +----> dot | | lot | | dig |
- // +--+--+ +--+--+ +--+--+
- // | | |
- // +--v--+ +--v--+ |
- // +----> dog | | log | |
- // | +--+--+ +--+--+ |
- // | | | |
- // | | +--v--+ | |
- // | +--->| cog |<-- + |
- // | +-----+ |
- // | |
- // | |
- // +----------------------------------+
- //
- // 1) queue <== "hit"
- // 2) queue <== "dit", "hot", "hig"
- // 3) queue <== "dot", "lot", "dig"
- // 4) queue <== "dog", "log"
126.
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the word list
For example,
Given:
beginWord = "hit"
endWord = "cog"
wordList = ["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:
- void buildTree(string beginWord, string endWord, unordered_set<string> &wordList, map<string, unordered_set<string>> &m)
- {
- map<string, int> level;
- level[beginWord] = ;
- queue<string> q;
- q.push(beginWord);
- int lvl = ;
- while (!q.empty())
- {
- string s = q.front();
- q.pop();
- if (lvl && level[s] > lvl)
- break;
- bool found = false;
- int l = s.length(), i;
- for (i = ; i < l; i++)
- {
- string t = s;
- for (char c = 'a'; c <= 'z'; c++)
- {
- t[i] = c;
- if (t == endWord)
- {
- m[s].clear();
- m[s].insert(endWord);
- lvl = level[s];
- found = true;
- break;
- }
- else if (wordList.find(t) != wordList.end())
- {
- if (level.find(t) == level.end())
- {
- level[t] = level[s] + ;
- m[s].insert(t);
- q.push(t);
- }
- else if (level[t] == level[s] + )
- {
- m[s].insert(t);
- }
- }
- }
- if (found)
- break;
- }
- }
- }
- int countnum = ;
- void dfs(string endWord, vector<vector<string>> &ans, vector<string> &v, map<string, unordered_set<string>> &m, string s)
- {
- if (m.find(s) == m.end() && s == endWord)
- {
- ans.push_back(v);
- return;
- }
- for (unordered_set<string>::iterator it = m[s].begin(); it != m[s].end(); it++)
- {
- v.push_back(*it);
- dfs(endWord, ans, v, m, *it);
- v.pop_back();
- }
- }
- vector<vector<string>> findLadders(string beginWord, string endWord, unordered_set<string> &wordList) {
- vector<vector<string>> ans;
- int l = beginWord.length(), n = wordList.size();
- if (l <= || n <= || beginWord == endWord)
- return ans;
- map<string, unordered_set<string>> m;
- buildTree(beginWord, endWord, wordList, m);
- vector<string> v;
- v.push_back(beginWord);
- map<string, bool> visit;
- dfs(endWord, ans, v, m, beginWord);
- return ans;
- }
- };
- // Solution
- //
- // 1) Using BSF algorithm build a tree like below
- // 2) Using DSF to parse the tree to the transformation path.
- //
- // For example:
- //
- // start = "hit"
- // end = "cog"
- // dict = ["hot","dot","dog","lot","log","dit","hig", "dig"]
- //
- // +-----+
- // +-------------+ hit +--------------+
- // | +--+--+ |
- // | | |
- // +--v--+ +--v--+ +--v--+
- // | dit | +-----+ hot +---+ | hig |
- // +--+--+ | +-----+ | +--+--+
- // | | | |
- // | +--v--+ +--v--+ +--v--+
- // +----> dot | | lot | | dig |
- // +--+--+ +--+--+ +--+--+
- // | | |
- // +--v--+ +--v--+ |
- // +----> dog | | log | |
- // | +--+--+ +--+--+ |
- // | | | |
- // | | +--v--+ | |
- // | +--->| cog |<-- + |
- // | +-----+ |
- // | |
- // | |
- // +----------------------------------+
127. 126. Word Ladder *HARD* -- 单词每次变一个字母转换成另一个单词的更多相关文章
- leetcode 127. Word Ladder、126. Word Ladder II
127. Word Ladder 这道题使用bfs来解决,每次将满足要求的变换单词加入队列中. wordSet用来记录当前词典中的单词,做一个单词变换生成一个新单词,都需要判断这个单词是否在词典中,不 ...
- 126. Word Ladder II(hard)
126. Word Ladder II 题目 Given two words (beginWord and endWord), and a dictionary's word list, find a ...
- 字符串A转换到字符串B,只能一次一次转换,每次转换只能把字符串A中的一个字符全部转换成另一个字符,是否能够转换成功
public class DemoTest { public static void main(String[] args) { System.)); } /** * 有一个字符串A 有一个字符串B ...
- 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 词语阶梯 II
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
- [LeetCode] 126. Word Ladder II 词语阶梯之二
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
- leetcode 126. Word Ladder II ----- java
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
- Leetcode#126 Word Ladder II
原题地址 既然是求最短路径,可以考虑动归或广搜.这道题对字典直接进行动归是不现实的,因为字典里的单词非常多.只能选择广搜了. 思路也非常直观,从start或end开始,不断加入所有可到达的单词,直到最 ...
- Java for LeetCode 126 Word Ladder II 【HARD】
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...
随机推荐
- CentOS 7一些常用配置
一.更改启动模式 背景:个人开发环境,安装了GNOME桌面,默认启动是图形化模式. 修改为命令行模式. systemctl set-default multi-user.target 二.命令行模式下 ...
- Using GET_GROUP_SELECTION For Record Groups in Oracle Forms
Retrieves the sequence number of the selected row for the given group. Suppose you want to get a par ...
- C#窗体->>随机四则运算
用户需求: 程序能接收用户输入的整数答案,并判断对错程序结束时,统计出答对.答错的题目数量.补充说明:0——10的整数是随机生成的用户可以选择四则运算中的一种用户可以结束程序的运行,并显示统计结果.在 ...
- [Effective Java]第五章 泛型
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 软/硬链接指令:ln
语法: ln [选项] 原文件 目标文件 选项: -s 创建软连接(创建软链接时,若所在文件夹不一致,原文件要使用绝对路径) 硬链接特征: 1.拥有相同i节点和存储block块,可以看成是同一个 ...
- const变量赋值报错分析
const变量赋值报错分析 const变量赋值报错 从变量到常量的赋值是合法C++的语法约定的, 如从char 到const char顺畅: 但从char **到 const char **编译器就会 ...
- javascript权威指南笔记--javascript语言核心(二)
1.函数作用域:在函数内声明的所有变量在函数体内始终是可见的.这意味着在变量声明之前甚至已经可用. *“声明提前”:javascript函数里声明的所有变量(但不涉及赋值)都被提前至函数的顶部. fu ...
- 《Linux内核设计的艺术》学习笔记(四)默认段和偏移寄存器
参考书籍:<Intel微处理器> 表1 默认的16位段 + 偏移寻址组合 段 偏移量 特殊用途 CS IP 指令地址 SS SP或BP 堆栈地址 DS BX.DI.SI.8位或16位数 数 ...
- iOS - Swift NSNumber 数字
前言 public class NSNumber : NSValue public class NSDecimalNumber : NSNumber NSNumber 可以被赋值为各种数值类型.我们可 ...
- hibernate对象关系实现(一)一对多
hibernate是对jdk一个封装工具,实现对象和数据库之间数据映射.使用时涉及到四个问题:a.对象之间的关系在类中的体现:b,对象关系对应的数据库中表之间体现:c.实现a,b在hibernate的 ...