【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。
更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴
们点赞、关注!

一般涉及到最小层数问题,要想到BFS。只要找到第一个符合条件的就是最小层数。

单词接龙

# 单向BFS

class Solution:

    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:

        queue = [(beginWord, 1)]

        word_list = [ chr(ord('a') + i) for i in range(27)]

        wordList = set(wordList)

        n = len(beginWord)

        while queue:

            word, step = queue.pop(0)

            if word == endWord:

                return step

            for i in range(n):

                for c in word_list:

                    tmp = word[:i] + c + word[i+1:]

                    if tmp in wordList:

                        wordList.remove(tmp)

                        queue.append((tmp, step + 1))

        return 0

# 双向BFS

class Solution:

    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:

        # 双向BFS

        word_set = set(wordList)

        if len(word_set) == 0 or endWord not in word_set:

            return 0

        if beginWord in word_set:

            word_set.remove(beginWord)

        visited = set()

        visited.add(beginWord)

        visited.add(endWord)

        begin_visited = set()

        begin_visited.add(beginWord)

        end_visited = set()

        end_visited.add(endWord)

        word_len = len(beginWord)

        step = 1

        # 简化成 while begin_visited 亦可

        while begin_visited and end_visited:

            if len(begin_visited) > len(end_visited):

                begin_visited, end_visited = end_visited, begin_visited

            next_level_visited = set()

            for word in begin_visited:

                word_list = list(word)

                for j in range(word_len):

                    origin_char = word_list[j]

                    for k in range(26):

                        word_list[j] = chr(ord('a') + k)

                        next_word = ''.join(word_list)

                        if next_word in word_set:

                            if next_word in end_visited:

                                return step + 1

                            if next_word not in visited:

                                next_level_visited.add(next_word)

                                visited.add(next_word)

                    word_list[j] = origin_char

            begin_visited = next_level_visited

            step += 1

        return 0

单词接龙2

单向遍历

class Solution:

    def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:

        tree, words, n = collections.defaultdict(set), set(wordList), len(beginWord) 

        if endWord not in wordList: return []

        # found为是否找到最短路径的标识默认False

        # q存储当前层的单词, nq存储下一层的单词

        # tree[x]会记录单词x所有相邻节点的单词,即可能到达最终结果的路径

        found, q, nq = False, {beginWord}, set()

        while q and not found: # 当找到路径或者队列中没有元素时结束

            words -= set(q) # 从words列表中去除当前层的单词,避免重复使用

            for x in q: # 遍历当前层的所有单词

                for y in [x[:i]+c+x[i+1:] for i in range(n) for c in 'qwertyuiopasdfghjklzxcvbnm']: # 改变当前单词的每一个字符

                    if y in words: # 只关心在words集合中的单词

                        if y == endWord: # 如果找到了,将found置为True,不会再继续寻找下一层.

                            found = True

                        else: 

                            nq.add(y) # 准备下一层的单词集合

                        tree[x].add(y) # 记录x单词满足条件的下一个路径

            q, nq = nq, set() # 重新复制q与nq, q为下一次循环需遍历的单词集合,nq置为空

        def bt(x): 

            # 递归,在tree中寻找满足条件的路径

            # for y in tree[x] 遍历当前单词的相邻节点

            return [[x]] if x == endWord else [[x] + rest for y in tree[x] for rest in bt(y)]

        if found == False:

            return []

        return bt(beginWord)

# 双向遍历

class Solution:

    def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:

        # 双向BFS

        tree, words, n = collections.defaultdict(set), set(wordList), len(beginWord)

        if endWord not in wordList: return []

        found, bq, eq, nq, rev = False, {beginWord}, {endWord}, set(), False

        while bq and not found:

            words -= set(bq)

            for x in bq:

                for y in [x[:i]+c+x[i+1:] for i in range(n) for c in 'qwertyuiopasdfghjklzxcvbnm']:

                    if y in words:

                        if y in eq: 

                            found = True

                        else: 

                            nq.add(y)

                        tree[y].add(x) if rev else tree[x].add(y)

            bq, nq = nq, set()

            if len(bq) > len(eq): 

                bq, eq, rev = eq, bq, not rev

        def bt(x): 

            return [[x]] if x == endWord else [[x] + rest for y in tree[x] for rest in bt(y)]

        return bt(beginWord)

最小基因变化

class Solution:

    def minMutation(self, start: str, end: str, bank: List[str]) -> int:

        #BFS

        possible_dict = {

                        "A": "CGT",

                        "C": "AGT",

                        "G": "ACT",

                        "T": "ACG"

                    }

        queue=[(start,0)]

        while queue:

            # 广度优先遍历模板

            (word, step)=queue.pop(0)

            if word ==end:

                return step

            

            for i, c  in enumerate(word):

                for p in possible_dict[c]:

                    # 从第0个位置开始匹配新的字符串

                    temp=word[:i]+p+word[i+1:]

                    # 在bank里面就处理(set中in操作复杂度是0(1))

                    if temp in bank: 

                        # 从bank里移除,避免重复计数

                        bank.remove(temp)  

                        # 加入队列,步数加1

                        queue.append((temp,step+1)) 

        return -1

二进制矩阵中的最短路径

class Solution:

    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:

        # BFS

        n = len(grid)

        if grid[n-1][n-1] == 1 or grid[0][0] == 1:

            return -1

        queue = [(0,0)]

        length = 1

        visited = set()

        visited.add((0,0))

        while queue:

            cur_nums = len(queue)

            for i in range(cur_nums):

                i,j = queue.pop(0)

                if i == n-1 and j == n-1:

                    return length

                for ni,nj in [(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)]:

                    if 0<= ni < n and 0<= nj < n and (ni,nj) not in visited and grid[ni][nj] == 0:

                        visited.add((ni,nj))

                        queue.append((ni,nj))

            length += 1

        return -1

关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

觉得不错的小伙伴,感谢点赞、关注加收藏哦!

欢迎关注下方GZH:阿旭算法与机器学习,共同学习交流~

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

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

相关文章

PyTorch自动梯度计算(注意点)

if params.grad is not None: params.grad.zero_() 我们实际的运算往往会涉及到若干个requires-grad为true的张量进行运算&#xff0c;在这种情况下&#xff0c;Pytorch会计算整个计算图上的损失的导数&#xff0c;并把这些结果累加到grad属性中。多次调用backward()会导致梯度…

京东体育用品销售数据分析与可视化系统

京东体育用品销售数据分析与可视化系统 前言数据爬取模块1. 数据爬取2. 数据处理3. 数据存储 数据可视化模块1. 数据查看2. 店铺商品数量排行3. 整体好评率4. 不同品牌市场占比5. 品牌差评率排名6. 品牌价格排名7. 品牌评论数量分布 创新点 前言 在体育用品行业&#xff0c;了…

[Verilog] Verilog 数据类型

主页&#xff1a; 元存储博客 文章目录 前言1. bit 类型2. reg 类型3 wire类型4 integer类型5 real类型6 parameter类型7 enum类型8 array 类型9 向量类型10 time 类型11 string 类型 前言 在 Verilog 中&#xff0c;有几种不同的数据类型可以用于声明和操作变量。 在 Verilo…

系列十、存储引擎

一、存储引擎 1.1、概述 大家可能没有听说过存储引擎&#xff0c;但是一定听过引擎这个词&#xff0c;引擎就是发动机&#xff0c;是一个机器的核心组件。 比如&#xff0c;对于舰载机、直升机、火箭来说&#xff0c;它们都有各自的引擎&#xff0c;引擎是它们最为核心的组件。…

攻防世界--easyphp

浅学一下吧~ 发开题目是这样的 最烦的就是代码审计&#xff0c;还是看得少 多审计两篇代码就好了&#xff08;还是因为自己会的不多&#xff09; <?php highlight_file(__FILE__);//将当前文件的源代码进行高亮显示 $key1 0;//将变量$key1的值初始化为0 $key2 0;//将变量…

第一个程序(STM32F103点灯)

点亮LED 看原理图确定控制LED的引脚看主芯片手册确定如何设置/控制引脚写程序 LED有很多种&#xff0c;像插脚的&#xff0c;贴片的。 它们长得完全不一样&#xff0c;因此我们在原理图中将它抽象出来。 嵌入式系统中&#xff0c;一个LED的电阻非常低&#xff0c;I U/R&…

12.5,12.15AVL树更新,定义,插入

定义平衡因子为右子树高度减去左子树高度 AVL树插入分为两步&#xff1a; 按照二叉搜索树的方式插入新节点调整平衡因子 对于平衡因子的调整&#xff0c;在插入之前&#xff0c;所有节点的平衡因子分为三种情况&#xff1a;0&#xff0c;1&#xff0c;-1插入后&#xff0c;新…

EasyExcel 简单导入

前边写过使用easyexcel进行简单、多sheet页的导出。今天周日利用空闲写一下对应简单的导入。 重点&#xff1a;springboot、easyExcel、桥接模式&#xff1b; 说明&#xff1a;本次使用实体类student&#xff1a;属性看前边章节内容&#xff1b; 1、公共导入service public …

ArkTS编译时遇到arkts-no-obj-literals-as-types错误【Bug已解决-鸿蒙】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2此Bug解决方案总结项目场景: 在开发鸿蒙项目过程中,遇到了arkts-no-obj-literals-as-types,总结了自己和网上人的解决方案,故写下这篇文章。 遇到问题: rkTS编译时遇到arkts-no-obj-literals-as-type…

【数据结构】(二叉树)计算结点|叶子结点|高度|第K层结点数

目录 概念&#xff1a; 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的创建 二叉树遍历 前序&#xff1a; 中序&#xff1a; 后序&#xff1a; 计算结点数 计算叶子结点数 计算树的高度&#xff08;深度&#xff09; 计算第K层结点数 概念&#xff1a; 一颗…

PVE系列-防火墙的免费安静之旅IPfire

Ventoy一款引导盘可以引导各种启动盘安装盘的工具https://www.ventoy.net/cn/index.html 在它的兼容iso的列表 中发现了Ipfirehttps://wiki.ipfire.org/ &#xff0c;本来用着openwrt也挺好&#xff0c;忍不住的虚拟机尝了尝鲜&#xff0c;发现的功能有2&#xff0c; 安全吧&a…

虚拟化之安全虚拟化

虚拟化首次引入是在Armv7-A架构中。那时&#xff0c;Hyp模式&#xff08;在AArch32中相当于EL2&#xff09;仅在非安全状态下可用。当Armv8.4-A引入时&#xff0c;添加了对安全状态下EL2的支持作为一个可选特性。 当处理器支持安全EL2时&#xff0c;需要使用SCR_EL3.EEL2位从E…

linux文件打包和压缩

7.2 文件打包和压缩 7.2.1 tar tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。 ​ tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 ​ tar命令是Unix/Linux系统中备给文件的…

NetSuite 智能商品推荐(Intelligent Recommendations)

本周在一个客户环境里&#xff0c;发现销售订单中有个Intelligent Recommendations的按钮。 本以为是客户新装的一个SuiteApp&#xff0c;仔细研究一下发现还不是。是个我们忽略的一个内建新功能。 Intelligent Recommendations&#xff0c;是2023.1版本推出的新功能。主要目的…

Qt 表格相关API

1.文本框 限制输入数据类型&#xff08;如仅英文&#xff09; QValidator* validator new QRegExpValidator(QRegExp("[a-zA-Z]"), lineText); // 创建正则表达式验证器lineText->setValidator(validator); // 将验证器设置给 QLineEdit QLineEdit&#xff1a;单…

(2023|ICLR,文本反演,LDM,伪词)一个词描述一张图像:使用文本反演个性化文本到图像的生成

An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion 公纵号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方…

Vue 2.x跟Vue 3.x有啥区别

大家好&#xff0c;我是咕噜-凯撒&#xff0c;我们都知道Vue 是一款比较流行的前端JavaScript 框架&#xff0c;在他演进的过程中出现了2个主要版本&#xff0c;Vue 2.x 和 Vue 3.x。这两个版本之间有很多的区别&#xff0c;下面我以自己的理解介绍一下他们之间的区别。 响应性…

开源的数据流技术,该选择Redpanda还是Apache Kafka?

本文将比较Apache Kafka和Redpanda两种开源的数据流技术&#xff0c;在云原生实时处理能力上的不同&#xff0c;以及如何在项目中做出选择。 目前&#xff0c;Apache Kafka不但成为了数据流处理领域事实上的标准&#xff0c;而且带动了同类产品的出现。Redpanda就是其中之一…

DeCap DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING

DeCap: DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING 论文&#xff1a;https://arxiv.org/abs/2303.03032 代码&#xff1a;https://github.com/dhg-wei/DeCap OpenReview&#xff1a;https://openreview.net/forum?idLt8bMlhiwx2 TL; DR&#xff…

AIGC(生成式AI)试用 15 -- 小结

断断续续的尝试在实际的工作使用中理解和测试AIGC&#xff0c;运用会越来越多、越来越广范&#xff0c;但也是时候做个小结了。 没有太用热火的ChatGPT&#xff0c;只是拿了日常最容易用到的CSDN创作助手&#xff08;每周写文章总是看到&#xff09;和文心一言&#xff08;…