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 transformed word must exist in the word list. Note that beginWord is not a transformed word.
Note:
- Return an empty list if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
- You may assume no duplicates in the word list.
- You may assume beginWord and endWord are non-empty and are not the same.
Example 1:
Input:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]
Output:
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
Example 2:
Input:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
Output: []
Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.
题目链接:https://leetcode-cn.com/problems/word-ladder-ii/
思路
延续第127题的思路,本题多了一项记录所有最短路径的要求。
最简单的方案就是先BFS算出最短长度,再DFS找出所有符合要求的路。
而下面的方法都采用了一边遍历一边记录的方案。
法一:BFS
点1:在同一层,访问过的单词不能立刻从单词表删除,因为可能还有其他路径也会访问;等同一层的所有路径结束后再删。
class Solution {
public:
vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
vector<vector<string>> res;
if(wordList.size()<=0 || beginWord==endWord
|| find(wordList.begin(), wordList.end(), endWord)==wordList.end()) return res;
unordered_set<string> del;
unordered_set<string> dict(wordList.begin(), wordList.end());
queue<vector<string>> record;
vector<string> p{beginWord};
record.push(p);
int step = 1, min = INT_MAX;
while(!record.empty()){
if(step>min) break;
for(auto word: del){
dict.erase(word);
}
del.clear();
int len = record.size();
for(int j=0; j<len; ++j){
auto tmp = record.front();
record.pop();
string s1 = tmp.back();
for(int i=0; i<s1.size(); ++i){
string s2 = s1;
for(char c='a'; c<='z'; ++c){
if(c==s2[i]) continue;
s2[i] = c;
if(dict.count(s2)>0){
vector<string> newp = tmp;
newp.push_back(s2);
if(s2==endWord){
res.push_back(newp);
min = step;
}else{
record.push(newp);
}
del.insert(s2);
}
}
}
}
++step;
}
return res;
}
};
法二:双向BFS
鉴于我还是个图小白,这个解法对我太难了。。
对这种hard题,我先会一种方法,这边挖个坑以后做图熟练了在回来填。。