(每日一练C++)CC25 词语序列

描述

给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度:

  1. 每一次转换只能改变一个单词
  2. 每一个中间词都必须存在单词字典当中

例如:

给定的初始单词start="red",

目标单词end ="tax"。

单词字典dict =["ted","tex","red","tax","tad","den","rex","pee"]

一个最短的转换序列为"red" -> "ted" -> "tad" -> "tax",

返回长度4

注意:

如果没有符合条件的转换序列,返回0。

题目中给出的所有单词的长度都是相同的

题目中给出的所有单词都仅包含小写字母

使用广度优先遍历种。

0)将start放入队列q1,初始count=0。

1)当q1非空,逐个遍历q1中的单词,count++;

2)设q1中的单词为str,寻找其邻近单词s,如果s等于end返回count+1;

否则将s放入队列q2中;

3)将q1与q2交换,继续执行1)。

其中代码修改了dict。

    int ladderLength(string start, string end, unordered_set<string> &dict) {
        queue<string> q1,q2,*p1,*p2;
        int count=0;
        for(p1=&q1,p2=&q2,p1->push(start);p1->size();swap(p1,p2)){
            ++count;
            for(string str;p1->size();p1->pop()){
                str = p1->front();           
            	for(int i=0;i<str.length();++i){
                	string s=str;
                    for(char ch='a';ch<='z';++ch){
                        if (ch==str[i]) continue;
                        s[i] = ch;
                        if (s==end) return count+1;
                        if (dict.find(s)!=dict.end()){
                            p2->push(s);
                            dict.erase(s);    // 防止死循环(回路)
                        }
                    }
                }
            }
        }
        return 0;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业_设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值