class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
unordered_set<string> dict(wordList.begin(), wordList.end());
if(!dict.count(endWord)) return 0;
int res=1,n=beginWord.size();
unordered_set<string> q1{{beginWord}}, q2{{endWord}};
dict.erase(beginWord);
while(!q1.empty() && !q2.empty()){
++res;
unordered_set<string> q;
for(const string& w:q1){
string cur = w;
for(int i=0;i<n;++i){
char old=cur[i];
for(char c='a'; c<='z'; ++c){
cur[i]=c;
if(q2.count(cur)){
return res;
} else if(dict.count(cur)){
q.insert(cur);
dict.erase(cur);
}
}
cur[i] = old;
}
}
swap(q,q1);
if(q1.size() > q2.size()){
swap(q1, q2);
}
}
return 0;
}
};