思路:
BFS。
注意wordDict的不断缩小,否则TLE。
每到一层,将所有可以转换的word加入到path中,count用来记录每一层是否遍历完,如果遍历完,用下一层转换的word的个数来更新count,且更新level,准备进入下一层搜索。
如果搜索到endWord,直接返回,路径长度一定是最小的。
class Solution {
public:
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordDict) {
queue<string> path;
path.push(beginWord);
int level = 1;
int count = 1;
wordDict.erase(beginWord);
while(wordDict.size()>0 && !path.empty()) {
string cur_word = path.front();
path.pop();
count--;
for(int i = 0; i < cur_word.size(); ++i) { //add next level 's all the words into path and set wordDict
string tmp_word = cur_word;
for(char c = 'a'; c <= 'z'; ++c) {
if(tmp_word[i] == c) continue;
tmp_word[i] = c;
if(tmp_word == endWord) return level + 1;
if(wordDict.find(tmp_word) != wordDict.end()) {
path.push(tmp_word);
}
wordDict.erase(tmp_word);
}
}
if(count == 0) {
count = path.size();
++level;
}
}
return 0;
}
};