class Solution {
public:
int ladderLength(string start, string end, unordered_set<string> &dict) {
if (start == end) {
return 1;
}
int n = start.size();
if (n < 1 || n != end.size()) {
return 0;
}
queue<string> Q;
Q.push(start);
dict.erase(start);
int length = 2;
while (!Q.empty()) {
int size = Q.size();
for (int i = 0; i < size; i++) {
string word = Q.front(); Q.pop();
for (int i = 0; i < n; i++) {
char oldChar = word[i];
for (char c = 'a'; c <= 'z'; c++) {
if (c == oldChar) continue;
word[i] = c;
if (word == end) {
return length;
}
if (dict.find(word) != dict.end()) {
Q.push(word);
dict.erase(word);
}
}
word[i] = oldChar;
}
}
length++;
}
return 0;
}
};
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
unordered_set<string> dict(wordList.begin(), wordList.end());
unordered_map<string, int> m;
queue<string> q;
m[beginWord] = 1;
q.push(beginWord);
while (!q.empty()) {
string word = q.front(); q.pop();
for (int i = 0; i < word.size(); ++i) {
string newWord = word;
for (char ch = 'a'; ch <= 'z'; ++ch) {
newWord[i] = ch;
if (dict.count(newWord) && newWord == endWord) return m[word] + 1;
if (dict.count(newWord) && !m.count(newWord)) {
q.push(newWord);
m[newWord] = m[word] + 1;
}
}
}
}
return 0;
}
};