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

该博客讨论了一种利用宽度优先搜索(BFS)算法解决从起始单词到目标单词的最短转换路径问题。在给定的单词列表中,通过逐层遍历并转换每个字符来构建路径,同时使用集合来避免重复访问。当找到目标单词且未被访问过时,返回步数。代码展示了如何实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路:
这道题是道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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值