【面试经典 150 | 图的广度优先搜索】最小基因变化

2024-04-30 10:28

本文主要是介绍【面试经典 150 | 图的广度优先搜索】最小基因变化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:广搜
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【图】【广度优先搜索】


题目来源

433. 最小基因变化


解题思路

方法一:广搜

思路

经过分析可知,题目要求将一个基因序列 A 变化成另一个基因序列 B,需要满足以下条件:

  • 序列 A 和序列 B 之间只有一个字符不同;
  • 变化字符只能从 ‘A’、‘C’、‘G’、‘T’ 中进行选择;
  • 变换后的序列 B 一定要在字符串数组 bank 中。

根据以上规则,我们可以尝试所有合法的基因变换,并找到最小的变换次数。为此,我们可以使用广度优先搜索尝试所有基因变换。队列的第一层放置的是 start 基因,第二层放置的是与第一层对比只改变一个字符的基因,第三层放置的是与第二层对比只改变一个字符的基因…

每改变一位字符得到一个不同的基因都需要判断是否是有效的,还需要判断是否是已经出现过的字符。对于有效的以及没有出现过的基因变换,需要增加到队列中。

一些特判情况:

  • 如果 start 和 end 相等,则直接返回 0;
  • 如果最终的基因序列不在 bank 中,则无法进行有效变换,直接返回 -1。

代码

class Solution {
public:int minMutation(string start, string end, vector<string>& bank) {unordered_set<string> cnt;      // 存放基因库中的基因unordered_set<string> visited;  // 存放被访问过的基因char keys[4] = {'A', 'T', 'C', 'G'};for(auto &str : bank){cnt.insert(str);}// 去除一些特殊情况if(start == end){return 0;}// end 基因不在基金库中,直接返回 -1if(cnt.count(end) == 0){return -1;}queue<string> q;q.push(start);visited.insert(start);int step = 1;while(!q.empty()){int sz = q.size();int i, j, k;for(i = 0; i < sz; ++i){ // 更改当前层的所有基因string now = q.front(); q.pop();for(j = 0; j < 8; ++j){for(k = 0; k < 4; ++k){if(keys[k] != now[j]){  // 改成不同的字符string next = now;next[j] = keys[k];// 有效的并且没有被访问过if(!visited.count(next) && cnt.count(next)){if(next == end){    // 变成 end 了,直接返回return step;}q.push(next);visited.insert(next);}}}}}++step;}return -1;}
};

复杂度分析

时间复杂度: O ( C × n × m ) O(C \times n \times m) O(C×n×m) n n n 为基因序列的长度, m m m 为数组 bank 的长度。对于队列中的每个合法的基因序列每次都需要计算 C × n C \times n C×n 种变化,在这里 C = 4 C=4 C=4;队列中最多有 m m m 个元素,因此时间复杂度为 O ( C × n × m ) O(C \times n \times m) O(C×n×m)

空间复杂度: O ( n × m ) O(n \times m) O(n×m)。合法性的哈希表中一共存有 m m m 个元素,队列中最多有 m m m 个元素,每个元素的空间为 O ( n ) O(n) O(n);队列中最多有 m m m 个元素,每个元素的空间为 O ( n ) O(n) O(n),因此空间复杂度为 O ( n × m ) O(n \times m) O(n×m)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

这篇关于【面试经典 150 | 图的广度优先搜索】最小基因变化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948616

相关文章

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何评价Ubuntu 24.04 LTS? Ubuntu 24.04 LTS新功能亮点和重要变化

《如何评价Ubuntu24.04LTS?Ubuntu24.04LTS新功能亮点和重要变化》Ubuntu24.04LTS即将发布,带来一系列提升用户体验的显著功能,本文深入探讨了该版本的亮... Ubuntu 24.04 LTS,代号 Noble NumBAT,正式发布下载!如果你在使用 Ubuntu 23.

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。