Given two words (beginWord and endWord), and a dictionary’s word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
- Only one letter can be changed at a time.
- Each transformed word must exist in the word list. Note that beginWord is not a transformed word.
Example 1: Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
Output: 5
Explanation: As one shortest transformation is “hit” -> “hot” -> “dot” -> “dog” -> “cog”,
return its length 5.
Example 2:
Input: beginWord = “hit”, endWord = “cog” wordList = [“hot”,“dot”,“dog”,“lot”,“log”]
Output: 0
Explanation: The endWord “cog” is not in wordList, therefore no possible transformation.
DFS超时,BFS就AC。
// DFS: TLE
bool can_change(const string& str1, const string& str2)
{
bool diff = false;
for(int i = 0; i < str1.length(); ++i)
if(str1[i] != str2[i]) {
if (diff) return false;
diff = true;
}
return true;
}
void dfs_127(const string& beginWord, const string& endWord, const vector<string>& wordList, vector<bool>& used, unsigned int steps, unsigned int& min_step)
{
if (beginWord.compare(endWord) == 0){
min_step = min(min_step, steps + 1);
return;
}
for (int i = 0; i < wordList.size(); ++i) {
if (used[i]) continue;
if (can_change(beginWord, wordList[i])) {
used[i] = true;
dfs_127(wordList[i], endWord, wordList, used, steps + 1, min_step);
used[i] = false;
}
}
}
int ladderLength(string beginWord, string endWord, vector<string> wordList) {
if (find(wordList.begin(), wordList.end(), endWord) == wordList.end()) return 0;
unsigned int min_step = wordList.size() + 1;
vector<bool> used(wordList.size(), false);
dfs_127(beginWord, endWord, wordList, used, 0, min_step);
return min_step == wordList.size() + 1 ? 0 : min_step;
}
// BFS: AC
bool can_change(const string& str1, const string& str2)
{
bool diff = false;
for(int i = 0; i < str1.length(); ++i)
if(str1[i] != str2[i]) {
if (diff) return false;
diff = true;
}
return true;
}
int ladderLength(string beginWord, string endWord, vector<string> wordList) {
if (find(wordList.begin(), wordList.end(), endWord) == wordList.end()) return 0;
unsigned int steps = 1;
queue<string> q;
vector<bool> used(wordList.size(), false);
const unsigned int len = wordList.size();
q.emplace(std::move(beginWord));
q.emplace("");
while(!q.empty()) {
auto str = q.front();
q.pop();
if(str.empty()){
if (q.empty()) break;
q.emplace("");
++steps;
continue;
}
for(unsigned int i = 0; i < len; ++i)
if(!used[i] && can_change(str, wordList[i])) {
if(wordList[i] == endWord) return ++steps;
q.push(wordList[i]);
used[i] = true;
}
}
return 0;
}