127.单词接龙
字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:
序列中第一个单词是 beginWord 。序列中最后一个单词是 endWord 。每次转换只能改变一个字母。
转换过程中的中间单词必须是字典 wordList 中的单词。给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到endWord 的最短转换序列中的单词数目。如果不存在这样的转换序列,返回 0。
双向BFS
//注意始终从少的队列先遍历,当Q1.size()>Q2.size()时要交换Q1和Q2
class Solution {
public:
int double_bfs(string beginWord, string endWord, vector<string>& wordList){
int len = beginWord.length();
unordered_set<string> wordSet(wordList.begin(), wordList.end());
if(wordSet.find(endWord) == wordSet.end()) return 0;
unordered_map<string, int> visit1;
unordered_map<string, int> visit2;
queue<string> Qfront, Qback;
visit1[beginWord] = 1;
visit2[endWord] = 1;
Qfront.push(beginWord);
Qback.push(endWord);
while(!Qfront.empty() && !Qback.empty()){
if(Qfront.size() > Qback.size()){
Qfront.swap(Qback);
visit1.swap(visit2);
}
string cur = Qfront.front();
int path = visit1[cur];
Qfront.pop();
for(int i = 0; i < len; i++){
for(char c = 'a'; c <= 'z'; c++){
string next = cur;
next[i] = c;
if(wordSet.find(next) != wordSet.end() && visit1.find(next) == visit1.end()){
visit1[next] = path + 1;
if(visit2.find(next) != visit2.end()) return visit1[next] - 1 + visit2[next];
Qfront.push(next);
}
}
}
}
return 0;
}
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
//双向BFS
return double_bfs(beginWord, endWord, wordList);
}
};