【广度优先搜索遍历 BFS】单词接龙

news2025/1/18 11:02:20

一、题目描述

字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk:
- 每一对相邻的单词只差一个字母。
-  对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
- sk == endWord

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

示例 ——

在这里插入图片描述

二、思路

  • 最关键的点 : 将单词转化为图中节点,将单词间的关系转化为图的边 —— 只有理解了这个,我们才能理解在本题中对图深搜的使用
  • 问题转化:理解了上述后,问题就转化为求图中两个节点间的最近路径长度
  • 广度优先搜索 : 我们使用广度优先搜索遍历来求解图中两个节点间的最近路径长度的问题,问题的答案为 —— 搜索到目标节点时,树的深度

对这部分思路的图解如下 :
在这里插入图片描述

三、代码

在写代码的过程中,为了使得我们的思路更加清晰,我们需要明确以下几点 :

  • 建图
  1. 提前建立好图,太繁琐,不采用
  2. 在广度优先搜索过程中,建立图 —— 具体采用的方式为,判断 curWord 只改变一个字母可以转换为那些图中的单词 (该单词要求不能被使用过)
  • 广度优先搜索
  1. Queue —— 用于存放搜索过程中树的每一层的节点 (广度优先搜索遍历必用)
  2. visit 数组 —— 用于记录节点是否被遍历过,对这部分的实现,可以有多种方式。我在实现时,采用 set 记录遍历过的节点,以判断 set 中是否存在的形式判断当前节点是否被遍历过。

完整代码:

    // 127. 单词接龙
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        if(!wordList.contains(endWord) || wordList.size() == 0){
            return 0;
        }
        int res = 1; // 包括起始点
        Queue<String> queue = new LinkedList<>();
        queue.offer(beginWord);
        Set<String> visit = new HashSet<>(); // 记录是否使用过
        visit.add(beginWord);
        while (!queue.isEmpty()){ 
            int size = queue.size();
            for(int i=0; i<size; i++){ // 遍历当前层
                String cur = queue.poll();
                if(canChangeTo(queue, cur, endWord, wordList, visit)){ // 构建图
                    return res+1;
                }
            }
            res++;
        }
        return 0;
    }

    // 建立图,找和 cur 相邻的节点
    public boolean canChangeTo(Queue<String> queue, String cur, String endWord, List<String> wordList, Set<String> visit){
        for(int i=0; i<wordList.size(); i++){ // 遍历所有点
            String temp = wordList.get(i);
            if(visit.contains(temp)){ // 排除已经用过的点
                continue;
            }
            if(oneLetter(cur, temp)){ // 判断是否相邻
                if(temp.equals(endWord)){ // 找到了目标节点,直接返回
                    return true;
                }
                queue.offer(temp); // 加入当前层队列
                visit.add(temp); // 标记已经使用过
            }
        }
        return false;
    }

    // 判断 cur 只变化一个单词是否可以得到 temp
    public boolean oneLetter(String cur, String temp){
        int cnt = 0;
        for(int i=0; i<cur.length(); i++){
            if(cur.charAt(i) != temp.charAt(i)){
                cnt++;
            }
            if(cnt > 1){
                return false;
            }
        }
        return cnt == 1;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面详解Java垃圾回收器

一&#xff1a;什么是垃圾回收 Java 方法栈、本地方法栈随着方法结束或者线程结束&#xff0c;堆中的对象是用完&#xff0c;都会进行回收内存&#xff0c;所以这些区域的内存分配和回收都具备确定性&#xff0c;不需要额外考虑回收的问题。而堆和方法区存储的对象可能只有在运…

Ad5761r GD32 STM32 驱动设计

MCU采用GD32,GD32基本上和STM32一样,针对ad5761r的时序操作是完全相同的.软、硬件设计已经再产品设计中实际使用。本文章提供参考硬件设计&#xff0c;以及对应的源代码&#xff0c;具体可以作为实际项目的参考设计AD5761R是一款单通道、16位串行输入、电压输出DAC。该器件采用…

网工进阶之路-锐捷NAT网络地址转换实验 ----尚文网络奎哥

实验拓扑&#xff1a;实验需求&#xff1a; 1&#xff1a;方框内设备为内网设备&#xff0c;方框外是外网设备&#xff0c;内网网段为192.168.1.0/24&#xff0c;外网路由器互联网段为100.1.1.0/24&#xff0c;外网PC网段为200.1.1.0/24 2&#xff1a;希望使用各种NAT实现内网…

2023年海外优青项目申报指南及政策解读

海外优青项目申报&#xff0c;一直备受海外优秀青年学者&#xff08;包括博士后研究人员&#xff09;关注。知识人网小编现将国家自然科学基金委员会公布的2023年申报指南全文摘录&#xff0c;并和往年加以对比进行政策解读&#xff0c;以飨读者。自2021年起&#xff0c;国家自…

【面试题】说说你对发布订阅、观察者模式的理解?区别?

大厂面试题分享 面试题库前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库一、观察者模式观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都将得到…

Elasticsearch-高级搜索(拼音|首字母|简繁|二级搜索)

需求&#xff1a; 中文搜索、英文搜索、中英混搜全拼搜索、首字母搜索、中文全拼、中文首字母混搜简繁搜索二级搜索&#xff08;对第一次搜索结果&#xff0c;再进行搜索&#xff09;一、ES相关插件 IK分词&#xff1a; GitHub - medcl/elasticsearch-analysis-ik: The IK A…

JsonWebToken远程代码执行漏洞(CVE-2022-23529)

漏洞描述 JsonWebToken 是一个用于创建、签名和验证 JSON Web Token开源库。node-jsonwebtoken是node.js 下 JsonWebToken 的实现。 在JsonWebToken < 8.5.1版本中由于jwt.verify()方法未对用户输入的secretOrPublicKey参数进行有效的检查。如果攻击者能够控制secretOrPub…

【docker12】docker复杂安装

docker复杂安装 之前是单机版&#xff0c;自娱自乐还是不错滴&#xff0c;但是如果是生产开发环境中是需要复杂集群安装的 1.安装mysql主从复制 1.1主从复制原理&#xff08;记得补&#xff09; 1.2主从搭建步骤 新建主服务器容器实例3307 命令&#xff1a; docker run -d …

Unity 实现一个特定动画状态切换树

前言 今天在工作中接到一需求,要求人物摆在不同的9个格子上,在哪个格子上,就走哪个格子动画播放逻辑; 打个比方:第一个格子上有台电脑,我将角色放上去,角色就玩电脑,每播完一次动画,就根据概率判断是否需要去喝水,最终实现的效果,就是将角色放上去,并且随机时间进行喝水;第二个…

TiDB 底层存储结构 LSM 树原理介绍

随着数据量的增大&#xff0c;传统关系型数据库越来越不能满足对于海量数据存储的需求。对于分布式关系型数据库&#xff0c;我们了解其底层存储结构是非常重要的。本文将介绍下分布式关系型数据库 TiDB 所采用的底层存储结构 LSM 树的原理。 1 LSM 树介绍 LSM 树&#xff08…

测试开发基础 mvn test | 利用 Maven Surefire Plugin 做测试用例基础执行管理

一、需求在测试工作场景中&#xff0c;经常会遇到下面的问题&#xff1a;1、执行自动化测试用例的时候&#xff0c;只想指定某个测试类&#xff0c;或者某个方法&#xff0c;又或者某一类用例等&#xff0c;怎么办&#xff1f;2、想要和 Jenkins 一起进行持续集成&#xff0c;可…

C语言_文件操作(下)

目录 8. 文件的随机读写 8.1 fseek 8.2 ftell 8.3 rewind ​9. 文件结束判定 10. perror 8. 文件的随机读写 假设文件中存放的是abcdef&#xff0c;如下图&#xff0c;通常在读文件时&#xff0c;是先读取首元素地址&#xff0c;也就是文件指针指向a&#xff0c;每读一…

【Linux进程信号】

Linux进程信号技术应用角度的信号信号的发送与记录信号处理常见方式产生信号通过终端按键产生信号通过系统函数向进程发信号由软件条件产生信号由硬件异常产生信号阻塞信号信号其他相关常见概念在内核中的表示sigset_t信号集操作函数sigprocmasksigpending捕捉信号内核空间与用…

three.js 之 入门篇 5之几何体的认知( 顶点创建矩阵、炫酷三角形科技物体、基础网格材质 material )

目录three.js 之 入门篇 5之几何体的认知01BufferGeometry设置顶点创建矩阵02 生产炫酷三角形科技物体03 常见的网格几何体 geometry04 基础网格材质 material04-1 初识别材质与纹理04-2 初识别材质与纹理 &#xff08; 平移、旋转 &#xff09;04-3 纹理显示设置&#xff08; …

C语言——指针面试题详解

&#x1f412;个人主页&#xff1a;平凡的小苏&#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情目录 1. 指针和数组笔试题解析 一维数组 字符数组 二维数组 2. 指针笔试题 笔试题1&#xff1a; 笔试题2&#xff1a; 笔试题…

ffmpeg 颜色空间转换分析

颜色空间转换有很多相关标准&#xff1a; https://docs.opencv.org/3.4.0/de/d25/imgproc_color_conversions.html https://www.itu.int/rec/R-REC-BT.601-4-199407-S/en ffmpeg命令行颜色空间转换是通过调用vf_scale中的swscale来进行转码。 我们通过gdb来调试ffmpeg. 首先编译…

《Getting Started with NLP》chap11:Named-entity recognition

《Getting Started with NLP》chap11&#xff1a;Named-entity recognition 最近需要做一些NER相关的任务&#xff0c;来学习一下这本书的第十一章 文章目录《Getting Started with NLP》chap11&#xff1a;Named-entity recognition11.1 Named entity recognition: Definition…

jar转成dex文件

jar转成dex文件 dx 可以利用android studio中的dx工具。 可以看到android的tool安装位置: 在此路径下的如下目录有dx.bat,这个正是我们需要使用的工具。 D:\sdk\build-tools\30.0.3将dx.bat添加到环境变量 基本指令 > dx --dex --output 输出路径 待转化的jar包C

高性能网络模式:Reactor 和 Proactor

文章目录演进多 Reactor 多进程 / 线程Proactor总结演进 如果要让服务器服务多个客户端&#xff0c;那么最直接的方式就是为每一条连接创建线程。其实创建进程也是可以的&#xff0c;原理是一样的&#xff0c;进程和线程的区别在于线程比较轻量级些&#xff0c;线程的创建和线…

【Dash搭建可视化网站】项目12:全球恐怖主义数据大屏制作步骤详解

全球恐怖主义数据大屏制作步骤详解1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 header.py文件完善3.4 filteritem.py文件完善3.5 api.py文件和api.ipynb文件完善3.6 staclbarline.py文件完善3.7 piechart.py文件完善3.8 m…