我的力扣算法127-单词接龙

ok
看见中等题,我们该怎么样?对咯,看着,试着,做着,不行就学习着。
看题:
在这里插入图片描述
在这里插入图片描述
先看题,单词接龙,就是说,给你一个开始的字符串,和最后结束的字符串,你要在一个规定的范围内,改变一个字符,使得字符串也在这个规定的范围内,直到最终成为了结束的字符串,最短的那个流程,就是我们需要的。
就比如,在这里插入图片描述
hit改变了中间的“i”,成为了hot是我们规定的字典里的单词就是满足条件的,然后再在hot的基础上改变,满足字典中的单词,直到变成cog就可以了。
接下来上代码:

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        queue<string> q;//定义一个队列,用来存放满足变化的单词,如hot可以变成的dot和lot。
        q.push(beginWord);//将开始单词放入队列中
        int res = 0;//一个计数器,记录转换单词的长度
        while(!q.empty()){
            res++;
            for(int sz = q.size(); sz > 0; sz--){
                string hop = q.front();//得到队列的第一个单词
                if(hop == endWord) return res;//如果刚好等于最后一个,
                //就直接得到里面只有一个单词,输出1
                q.pop();//释放掉第一个
                for(auto & w: wordList){//遍历单词表
                    if(w.empty() || w.length() != beginWord.length()) continue;
                    //如果这个单词表里的单词为空或者已经遍历到最后一个,就没必要再进行下面的操作了
                
                    int diff = 0;//计数器,如果现在的单词和字典的单词比较有超过一个不同的字符,
                    //那么这个单词表的单词就不满足条件。
                    for(int i = 0; i < w.length(); i++){//当前单词和字典单词比较
                        if(w[i] != hop[i]) ++diff;//遇到不同的字符计数器++
                        if(diff > 1) break;//如果计数器大于1了,说明这个单词不满足条件
                    }
                    if(diff <= 1){
                        q.push(w);//如果满足条件届放入队列中,作为下一次的开始单词进行循环。
                        w = "";//字典中比过的单词就不需要再比了,置为空,减少时间
                    }
                }
            }
        }
        return 0;
    }
};

ok,代码中的注释就是我的理解,理解万岁!
下面是进阶代码,仅供参考,利用的是双向广度优先搜索,时间直接提升了一个档次。

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> wordSet{wordList.begin(), wordList.end()};
        if(wordSet.find(endWord) == wordSet.end()) return 0;
        
        int res = 1;
        unordered_set<string> beginSet{beginWord};
        unordered_set<string> endSet{endWord};
        while(!beginSet.empty()){
            res++;
            unordered_set<string> nextSet;
            for(auto & word : beginSet) {
                wordSet.erase(word);
            }
            for(auto & word: beginSet){
                for(int i = 0; i < word.size(); i++){
                    string nextWord = word;
                    for(char j = 'a'; j <= 'z'; j++){
                        nextWord[i] = j;
                        if(endSet.find(nextWord) != endSet.end()) return res;
                        if(wordSet.find(nextWord) != wordSet.end()){
                            nextSet.insert(nextWord);
                        }
                    }
                }
            }
            beginSet = nextSet;
            if(beginSet.size() > endSet.size()){
                swap(beginSet, endSet);
            }
        }
        return 0;
    }
};

芜湖,起飞
加了个油

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值