单词接龙(BFS,有点意思的题)

在这里插入图片描述
题目链接!

思路:
这道题是道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;
    }
};