leetcode 127. 单词接龙(bfs+建图+最短路)

Java实现 LeetCode 127 单词接龙 127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 说明: 如果不存在这样的转换序列,返回 0。 所有单词具有相同的长度。 所有单词只由小写字母组成。 字典中不存在重复的单词。 你可以假设 beginWo... 阅读详情

题目描述:

题目链接:leetcode 127. 单词接龙
字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:

  • 序列中第一个单词是 beginWord 。
  • 序列中最后一个单词是 endWord 。
  • 每次转换只能改变一个字母。
  • 转换过程中的中间单词必须是字典 wordList 中的单词。

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。

示例 1:

输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
输出:5
解释:一个最短转换序列是 “hit” -> “hot” -> “dot” -> “dog” -> “cog”, 返回它的长度 5。

示例 2:

输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”]
输出:0
解释:endWord “cog” 不在字典中,所以无法进行转换。

提示:

1 <= beginWord.length <= 10
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord、endWord 和 wordList[i] 由小写英文字母组成
beginWord != endWord
wordList 中的所有字符串 互不相同

解法:

整体思路:在能够通过变换一个单词而相互得到两个单词间连一条边,就可以得到一张图。求从 beginWord 到 endWord 的 最短转换序列就转换转换成了求图中beginWord 到 endWord 的最短路径。

具体操作(结合下图理解):
wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
在这里插入图片描述
1.为了方便建图,我们给每个单词按其在wordList中的下标依次编号。由题目可以看出,beginWord并不在wordList中,故应该将其添加到wordList中并统一编号。编号时声明一个unordered_map<string,int>mp,用于存储每个单词和其编号的映射关系。

2.建图:遍历wordList中的单词,尝试将当前单词的每一个依次换成字母 x x x( x x x为小写字母a-z),从而变成一个新单词。假如更换了一个字母的单词存在于wordList中(也即存在于映射关系mp中)就把当前单词和这个新单词间连一条边。

3.求最短路:由于是无权图(也可视作边权为1),用bfs遍历一下图就可以得到最短路。

C++代码:

struct node{
   int u; //当前节点编号   
   int step;  //记录路径上地变换次数
};

class Solution {
public:

    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
    
    //给单词编号,并建立单词和编号的映射关系:
    wordList.push_back(beginWord);
    int n=wordList.size();
    unordered_map<string,int>mp;
    int s=-1,t=-1;   
    //s、t分别记录beginWord和endWord的编号
    for(int i=0;i<n;i++){
    if(wordList[i]==beginWord) s=i;
    if(wordList[i]==endWord)   t=i;
    mp.insert(pair<string, int>(wordList[i],i));
    }
    if(t==-1) return 0;  //若endWord不在worList中则不存在相应变换

    //建图:
    vector<vector<int>>Graph(n,vector<int>());
    for(int i=0;i<n;i++){
       int len= wordList[i].size();
       for(int j=0;j<len;j++){
           for(int k=0;k<=25;k++){
               string v=wordList[i];
               v[j]='a'+k;   //逐一地更改当前单词中的字母
               unordered_map<string,int>::iterator it; 
               it=mp.find(v);
               //更改了字母地单词如果存在于wordList中,就创建边
               if(it!=mp.end()){
                   Graph[i].push_back((*it).second);
               }
           }
       }
    }
    
    //bfs求最短路:
    vector<bool>vis(n,false);  //记录是否遍历过
    queue<node>q;
    q.push((node){s,1});
    while(!q.empty()){
        node now=q.front();
        int u=now.u;
        int step=now.step;
        q.pop();
        vis[u]=true;
        int l=Graph[u].size();
        for(int i=0;i<l;i++){
            if(vis[Graph[u][i]]) continue;
            if(Graph[u][i]==t) return step+1;
            q.push((node){Graph[u][i],step+1});
        }
    }
    
    return 0;
    }

};

LeetCode127——单词接龙 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/word-ladder/description/ 题目描述: 知识点:图的广度优先遍历,SPFA算法 思路一:图的广度优先遍历 (1)新建一个辅助的类LevelWord,类包含两个属性,代表word的Str... 阅读详情

相关推荐

算法题解:单词接龙(JAVA+BFS算法)

单词接龙(JAVA+BFS算法) 原题链接:127.Word Ladderhttps://leetcode.com/problems/word-ladder/ 给定两个单词(beginWord和 endWord)和一个字典,找到从beginWord 到endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 ...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 1802

【广搜、哈希】| LeetCode 127. 单词接龙

题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: 序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。 给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。

HangHug_L的博客 300

Leetcode 单词接龙

特性单词接龙(Word Ladder)最小基因变化(Min Mutation)起始 step1(包括起点)0(只计变换次数)变化字符集'a'到'z'共 26 个字母4 种碱基每轮字符数组构建方式每次新建char[]修改原数组char[],需回溯目标不存在的返回值0-1是否需要手动回溯❌ 不需要✅ 需要。

985小菜鸡 920

LeetCode 127. 单词接龙 ---BFS模拟

单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: 序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。 给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 .

weixin_43918046的博客 144

Leetcode 127: 单词接龙

给定两个单词beginWord和endWord,以及一个单词列表wordList,找到从beginWord到endWord的最短转换序列长度。wordList如果不存在这样的转换序列,则返回0。

互联网架构师笔记 1085

【困难】力扣算法题解析LeetCode127:单词接龙

本文探讨了单词转换问题的最优解法,通过双向BFS高效寻找最短路径。当给定起点词、终点词和候选词列表时,算法在O(M×N)时间复杂度内求解(M为单词长度,N为字典大小)。相比单向BFS,双向搜索将时间复杂度从O(N²)优化至O(N),并通过小集合优先策略进一步减少搜索空间。关键步骤包括字典预处理、双向队列初始化、层级扩展与相遇检测。

ylumwd的博客 754

一刷303-双向BFS-剑指 Offer II 108. 单词演变h(127. 单词接龙)

题目: 在字典(单词列表) wordList 中, 从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: 序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。 给定两个长度相同但内容不同的单词 beginWord 和 endWord 和一个字典 wordList , 找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目

唐宋元明清的博客 328

AlphaFold-multimer实战:从零开始预测STAT1-STAT2蛋白复合物结构

本文详细介绍了使用AlphaFold-multimer从零开始预测STAT1-STAT2蛋白复合物结构的完整实战流程。内容涵盖环境配置、数据库准备、序列处理、参数优化及结果可信度评估,为研究者利用这一AI工具进行复合物结构预测提供了系统指南和深度解析。

weixin_29094301的博客 887

LC127-单词接龙

127. 单词接龙 难度困难687 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: 序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。 给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存

qq_44236958的博客 419

Transformer模型详解(图解最完整版)

Transformer由论文提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。Transformer 与 RNN 不同,可以比较好地并行训练。

2501_91695094的博客 2701

CentOS 7 离线升级 OpenSSH 9.9p2 保姆级教程(含依赖包下载与常见报错解决)

本文提供了一份详尽的CentOS 7系统离线升级OpenSSH至9.9p2版本的完整教程。针对无外网环境,重点讲解了依赖包(尤其是OpenSSL 3.x)的离线下载与编译部署,并深入解决了编译过程中常见的“libcrypto.so缺失”等动态库链接错误。教程涵盖从环境准备、源码编译、服务配置到系统集成的全流程,最后还提供了关键的回滚方案与应急预案,是运维人员在内网环境中进行安全加固的实用指南。

weixin_29248313的博客 323

LeetCode 126. 单词接龙 II (最短路 dijkstra算法)

给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 说明: 如果不存在这样的转换序列,返回一个空列表。 所有单词具有相同的长度。 所有单词只由小写字母组成。 字典中不存在重复的单词。 你可以假设 begi...

sgh666666的博客 787

《跨界杂谈》华为印象(五):高度集权的矩阵式架构

高度集权的矩阵式架构 “高度集权的矩阵式架构”不是官方术语。是笔者的一位同事非常经典的总结。解释这个句话还是有点困难的,笔者入职华为三年也没彻底搞明白,在这里只能尝试性的解释一下。 矩阵 我们先看一下“矩阵”。华为有两套部门职能体系,华为内部术语,叫实线部门和虚线部门。由实线与虚线部门交叉构成矩阵。大部分(但不是所有)华为员工都由两个部门(两个领导)进行管理。对员工而言,所谓的实线部

《云计算架构技术与实践》 2995

127. 单词接龙

LeetCode 第 127 题是“单词接龙”。给定两个单词beginWord和endWord,以及一个字典wordList,找到从beginWord到endWord每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。

qq_40844444的博客 836

3DGS实战笔记:从相机坐标系到屏幕像素,手把手推导高斯椭球的投影变换矩阵

本文详细解析了3D高斯散射(3DGS)技术中从相机坐标系到屏幕像素的几何变换过程,重点推导了高斯椭球的投影变换矩阵。通过视图变换、投影变换和视口变换的完整流程,结合雅可比矩阵处理协方差矩阵,实现了高效的三维重建与渲染。文章提供了Python代码示例,帮助开发者深入理解3DGS的核心几何变换机制。

weixin_28691741的博客 438

手把手教你用VMware虚拟机搭建PCAN开发环境:从Ubuntu安装到CAN通讯实战

本文详细指导如何在VMware虚拟机中搭建PCAN开发环境,涵盖从Ubuntu系统安装、VMware精细配置、PCAN-USB设备直通,到Linux驱动编译、can-utils工具集使用及完整CAN通讯测试的全过程。通过实战步骤与故障排查技巧,帮助开发者快速构建稳定高效的CAN总线开发与测试沙盒,特别适合车载诊断与嵌入式通讯应用。

weixin_29216353的博客 224

BFS 解决边权为1的最短路问题

1926. 迷宫中离入口最近的出口,433. 最小基因变化,127. 单词接龙,675. 为高尔夫比赛砍树

Dirty_artist的博客 1462

Android SystemUI——自定义状态栏和导航栏(十二)

通过前面的文章内容,我们了解了Android系统原生的状态栏StatusBar和车载系统状态栏CarStatusBar的启动流程以及视图构建流程,这里我们来简单的看一下自定义状态栏和导航栏视图的实现流程。

小旭的专栏 2012

Leetcode.127 单词接龙

BFS

感觉画质不如...原神的博客 1848

Simulink开发项1000例实战专栏--实例161:基于Simulink实现电动汽车电机驱动系统的建模与仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 189

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode第127题_单词接龙

字典wordList中从单词beginWord和endWord的是一个按下述规格形成的序列siwordListbeginWordwordList给你两个单词beginWord和endWord和一个字典wordList,返回从beginWord到endWord的中的。如果不存在这样的转换序列,返回0。

qq_40263592的博客 1034

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

127. 单词接龙【 力扣(LeetCode) 】

基本思路是一样的,区别就在于单词的长度不固定,单词的字母范围不一样。本质上都是构图+BFS 找最短路径。的 最短转换序列 中的 单词数目。如果不存在这样的转换序列,返回 0。虽然复杂度相同,但是双向搜索的复杂度的系数会小一点。的 转换序列 是一个按下述规格形成的序列。【C 是单词长度,N 是单词个数】【C 是单词长度,N 是单词个数】

yyh520025的博客 1042

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

127.单词接龙 python

输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”]解释:一个最短转换序列是 “hit” -> “hot” -> “dot” -> “dog” -> “cog”, 返回它的长度 5。时,立即返回当前的层级数加一,表示从。

sysu63的博客 1303

LeetCode 127:单词接龙

LeetCode 127单词接龙问题要求找到从beginWord到endWord的最短转换序列,每次只能改变一个字母且中间单词必须在wordList中。核心解法是广度优先搜索(BFS),通过分层遍历确保首次到达目标时的路径最短。算法步骤包括:预处理检查、BFS初始化、邻居生成和去重处理。关键优化包括使用HashSet加速查找,26字母替换生成邻居,以及分层遍历保证最短路径。时间复杂度为O(N×L×26),空间复杂度O(N)。该BFS方案是解决此类最短路径问题的经典方法。

m0_75126572的博客 884
上一篇: leetcode 101. 对称二叉树
下一篇: leetcode 207. 课程表 (拓扑排序)
准图灵奖得主
博客等级 码龄8年 355粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值