class Solution {
public:
int ladderLength(string beginWord, string endWord, vector& wordList) {
unordered_set wordDict(wordList.begin(), wordList.end());
// endWord 没有在 wordList 中出现;
if(wordDict.find(endWord) == wordDict.end()){
return 0;
}
// 注意unordered_set的初始化
unordered_set beginSet{beginWord};
unordered_set endSet{endWord};
int step = 1;
while(!beginSet.empty()){
unordered_set tempSet;
++step;
// wordDict中去除,beginSet中已经出现的字符串;
for(unordered_set::iterator it = beginSet.begin(); it != beginSet.end(); ++it){
wordDict.erase(*it);
}
for(unordered_set::iterator it = beginSet.begin(); it != beginSet.end(); ++it){
string s = *it;
// 对s中的每一位字符进行修改
for(int i = 0; i < s.size(); ++i){
string tmpStr = s;
for(char c = 'a'; c <= 'z'; ++c){
tmpStr[i] = c;
// 1. 判断修改后字符串tmpStr,是否出现在wordDict中;
if(wordDict.find(tmpStr) == wordDict.end()){
continue;
}
// 2. 修改后的字符串tmpStr,出现在endSet中则找到答案;
if(endSet.find(tmpStr) != endSet.end()){
return step;
}
// 3. 相差一个字符的字符串,加入到tempSet中;
tempSet.insert(tmpStr);
}
}
}
// 每次从中间结果少的那一端进行搜索;beginSet保存每次中间少的搜索结果;
if(tempSet.size() < endSet.size()){
beginSet = tempSet;
} else {
beginSet = endSet;
endSet = tempSet;
}
}
return 0;
}
};