思路:
这道题是道BFS题,但是比较有难度,这里我们是用bfs“建图”,是虚拟建图,先用set容器保存我们的单词列表(当然我们先把begin_word这个单词在列表中删除,如果有的话。)通过队列从begin_word出发,开始一层一层遍历;
首先我们先出队首,对head_word进行每个字母的转换(s.size()*26的时间复杂度),对了,我们还得用visit_set容器记录我们之前遍历过的单词(是指在单词列表中),因为我们知道bfs搜索一旦到达终点,一定是最少步数的答案!
步数是很好记录的,有多少层就有多少步。那么怎么才知道达到终点呢?那肯定是在单词列表中能找到end_word这个单词以及在visit_set容器中没有访问过才可以!
代码:
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
unordered_set<string> words(wordList.begin(), wordList.end());
if ( words.empty() || words.find(endWord) == words.end() ) return 0;
words.erase(beginWord);
queue<string> que;
que.push(beginWord);
unordered_set<string> visited;
visited.insert(beginWord);
int step = 1;
while ( !que.empty() ) {
int n = que.size();
//抽出每一层进行遍历
while ( n-- ) {
string curWord = que.front();
que.pop();
//这里进行每个字母的转换
for ( int i = 0; i < curWord.size(); ++i ) {
char originalChar = curWord[i];
for ( int j = 0; j < 26; ++j ) {
if ( char('a' + j) == originalChar ) continue;
curWord[i] = (char)('a' + j);
//这里就是入队的条件以及达到终点的条件
if ( words.find(curWord) != words.end() && visited.find(curWord) == visited.end() ) {
if ( curWord == endWord ) return step + 1;
else {
que.push(curWord);
visited.insert(curWord);
}
}
}
curWord[i] = originalChar;
}
}
++step;
}
return 0;
}
};