Leetcode 最小基因变化

在这里插入图片描述

java solution:BFS 算法

class Solution {public int minMutation(String startGene, String endGene, String[] bank) {//首先创建一个集合来存储有效基因串Set<String> bankSet = new HashSet<>(Arrays.asList(bank));if(!bankSet.contains(endGene)) return -1;//初始化BFS所需的char[] genes = new char[]{'A', 'G', 'T', 'C'};Queue<String> queue = new LinkedList<>();queue.offer(startGene);Set<String> visited = new HashSet<>();visited.add(startGene);int steps = 0;while(!queue.isEmpty()) {int size = queue.size();for(int i = 0; i < size; i++) {String current = queue.poll();if(current.equals(endGene)) return steps;//将当前字符串转换为字符数组char [] currArray = current.toCharArray();for(int j = 0; j < currArray.length; j++) {char oldChar = currArray[j];for(char g : genes) {if(g == oldChar) continue;currArray[j] = g;String mutated = new String(currArray);if(bankSet.contains(mutated) && !visited.contains(mutated)) {queue.offer(mutated);visited.add(mutated);}}currArray[j] = oldChar; // 回溯}}steps++;}return -1;}
}

好的,我们来详细剖析这段 Java 代码,理解它的算法思想和执行流程。这其实是一个经典的 图搜索问题,问题背景是基因变换,但本质和图上的最短路径查找非常类似。


🧠 问题建模(算法思想)

🧬 核心问题描述:

我们从一个 start 基因串(字符串),每次只能变换一个字符(只允许变换为 ACGT),且每次变换后的字符串必须在 bank 中出现过,最终希望变换到目标字符串 end,求最少变换次数。


🗺️ 算法模型(抽象为图)

  • 每一个有效基因串是 图中的一个节点
  • 如果两个基因串只差一个字符,且变换后的串在 bank 中出现,那么这两个节点之间就有一条边。
  • 要找的就是从 startend最短路径长度(经过的边数),这是典型的**BFS(广度优先搜索)**应用场景。

🛠️ Java 代码详细解析

Set<String> bankSet = new HashSet<>(Arrays.asList(bank));
if (!bankSet.contains(end)) return -1;

✅ 初始化阶段:

  • 把基因库 bank 转成 Set,加快查询速度(O(1))。
  • 如果目标基因 end 不在 bank 中,那肯定到达不了,直接返回 -1

char[] genes = new char[]{'A', 'C', 'G', 'T'};
Queue<String> queue = new LinkedList<>();
queue.offer(start);
Set<String> visited = new HashSet<>();
visited.add(start);
int steps = 0;

✅ 准备 BFS 所需的结构:

  • genes:4 个可选的字符,便于构造变异。
  • queue:BFS 队列,初始化时把 start 放进去。
  • visited:避免重复访问,防止死循环。
  • steps:当前已经变换的次数,代表路径长度。

while (!queue.isEmpty()) {int size = queue.size(); // 当前层有多少节点

✅ BFS 主体循环:

  • 每一轮 BFS 相当于一次“变异”,我们遍历当前层所有节点(当前的字符串),进行下一步扩展。
  • steps 就是变换次数,每一层就对应一次基因变换。

    for (int i = 0; i < size; i++) {String current = queue.poll();if (current.equals(end)) return steps;
  • 从队列中取出当前处理的字符串 current
  • 如果已经变异成功(等于 end),返回当前的变异次数 steps

        char[] currArray = current.toCharArray();for (int j = 0; j < currArray.length; j++) {char oldChar = currArray[j];
  • 遍历字符串中的每一个字符,尝试每个位置进行变异(一个字符变成另一个)。

            for (char g : genes) {if (g == oldChar) continue;currArray[j] = g;String mutated = new String(currArray);
  • 尝试把当前字符换成 A/C/G/T 中的其他字符,形成一个新字符串 mutated

                if (bankSet.contains(mutated) && !visited.contains(mutated)) {queue.offer(mutated);visited.add(mutated);}
  • 如果这个变异后的字符串合法(在 bankSet 中,且没访问过),就放入队列,作为下一层搜索的起点。

            currArray[j] = oldChar; // 回溯,恢复原字符}}steps++; // 这一层结束,步数+1
}
  • 每次外层 while 循环结束,表示进行了一次合法变异,steps++

return -1; // 如果队列空了还没找到,说明变不了

✅ 算法时间复杂度分析

  • 状态数:最多为 bank 中字符串个数(假设为 n)。
  • 每个状态的扩展操作:每个字符最多有 3 种变异方式(A/C/G/T 中除了自己),所以最多 8 × 3 = 24 种尝试。
  • 整体复杂度O(n × m),其中 n 是 bank 长度,m 是字符串长度(固定为 8)。

🧪 示例解释

以示例 2 为例:

start = "AACCGGTT"
end = "AAACGGTA"
bank = ["AACCGGTA","AACCGCTA","AAACGGTA"]

BFS 过程:

  1. Start: "AACCGGTT""AACCGGTA"(step 1)
  2. "AACCGGTA""AAACGGTA"(step 2)
    结果:最少变换次数是 2。

如果你还想了解:

  • 用 DFS 解法解决这个问题?
  • 如何构造图再用 Dijkstra 来做?
  • 或是如何扩展到通用的字符串变换题(比如 Word Ladder)?

可以告诉我,我们可以进一步延伸~

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

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

相关文章

Hive工作所遇问题之Hive -e命令中使用正则表达式问题

前言 今天工作因为之前建表时&#xff0c;看不到数据&#xff0c;导致建表的字段格式有问题&#xff0c;然后使用split函数拆分时&#xff0c;发现是正则表达式使用的问题。 下面来说明问题 一、数据准备 --创建码表&#xff1a; create table hive_sql.d_type( type_id st…

自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”&#xff0c;就感觉非常神秘&#xff0c;非常遥远。大家之所以觉得复杂&#xff0c;是因为落地运用起来很复杂&#xff1b;每个公司&#xff0c;每个业务及产品线的业务流程都不一样&#xff0c;所以就导致了“自动化…

如何防止用户大量使用同一用户名恶意攻击

如何防止用户大量使用同一用户名恶意攻击&#xff1f; 在数据库层兜底 使用redisson分布式锁 当用户第一次在毫秒级别使用大量的请求去注册 由于布隆过滤器中还没没有缓存这些数据 大量请求打在数据库上可能会造成数据库宕机 因此可以使用reddison分布式锁来保证只有一个…

超详细docker部署搭建私有仓库harbor

一、安装docker 确保你的服务器上已经安装了 Docker 如果没有安装&#xff0c;按以下方法安装 yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io 启动d…

541. 反转字符串 II

541. 反转字符串 IIhttps://leetcode.cn/problems/reverse-string-ii/ 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。…

力扣HOT100之普通数组:53. 最大子数组和

这道题目我用贪心做的&#xff0c;感觉用贪心的思路比较简单&#xff0c;以后要是面试碰到这道题就直接用贪心好了&#xff0c;这道题用贪心的核心思想就是不断将数组元素i加入总和sum&#xff0c;如果sum比当前维护的最大值result更大&#xff0c;说明当前遍历到的i是正数&…

muduo库的思路梳理

前言 对于muduo库源码的剖析我发现还是有些混乱的&#xff0c;所以这里再次梳理一下muduo网络库争取可以简单明了 首先对于muduo库来说&#xff0c;不能想的得太过于复杂&#xff0c;它无非就是一个线程池加上epoll组成的网络库 这里我们从用的角度出发理解muoduo网络库 #inc…

【C语言系列】数据在内存中存储

数据在内存中存储 一、整数在内存中的存储二、大小端字节序和字节序判断2.1什么是大小端&#xff1f;2.2练习2.2.1练习12.2.2练习22.2.3练习32.2.4练习42.2.5练习52.2.6练习6 三、浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1 浮点数存的过程3.2.2 浮点数取的过程 3.3题目…

C++学习之网盘项目单例模式

目录 1.知识点概述 2.单例介绍 3.单例饿汉模式 4.饿汉模式四个版本 5.单例类的使用 6.关于token的作用和存储 7.样式表使用方法 8.qss文件中选择器介绍 9.qss文件样式讲解和测试 10.qss美化登录界面补充 11.QHTTPMULTIPART类的使用 12.文件上传协议 13.文件上传协议…

多模态自动驾驶混合渲染HRMAD:将NeRF和3DGS进行感知验证和端到端AD测试

基于3DGS和NeRF的三维重建技术在过去的一年中取得了快速的进步&#xff0c;动态模型也变得越来越普遍&#xff0c;然而这些模型仅限于处理原始轨迹域内的对象。 HRMAD作为一种混合方案&#xff0c;将传统的基于网格的动态三维神经重建和物理渲染优势结合&#xff0c;支持在任意…

质检LIMS系统在食品生产加工企业的应用 如何保证食品生产企业的安全

在食品生产加工领域&#xff0c;质量安全是贯穿全产业链的生命线。随着《食品安全法》对全过程追溯要求的深化&#xff0c;传统实验室管理模式已难以满足高效、精准的质量管控需求。质检实验室信息管理系统&#xff08;LIMS&#xff09;作为数字化升级的核心工具&#xff0c;正…

树莓派超全系列文档--(8)RaspberryOS实用程序

RaspberryOS实用程序 实用程序kmsprintvclogvcgencmdvcosversionget_throttledmeasure_tempmeasure_clock [clock]measure_volts [block]otp_dumpget_config [configuration item|int|str]get_mem typecodec_enabled [type]mem_oommem_reloc_statsread_ring_osc 文章来源&#…

解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操…

文件上传绕过的小点总结(6)

14.文件上传&#xff08;文件包含漏洞&#xff09;二次渲染 很多服务器为了防止代码嵌入图片&#xff0c;通常会将上传的图片进行重新生成处理&#xff0c;包括文件格式转换等等&#xff0c;嵌入的恶意代码很容易被改掉。于是产生了二次渲染&#xff0c;二次渲染的原理就是找到…

x-cmd install | Wuzz - Web 开发与安全测试利器,交互式 HTTP 工具

目录 安装配置快捷键上下文相关搜索待办事项 在 Web 开发和安全测试中&#xff0c;我们经常需要检查和修改 HTTP 请求。浏览器自带的开发者工具虽然好用&#xff0c;但复制出来的 cURL 命令冗长且难以编辑。今天要介绍的是 Wuzz&#xff0c;一款交互式命令行 HTTP 工具&#xf…

python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img cv2.imread(r"C:\Users\123\…

搭建k8s集群的可观测体系(log和metric)(已踩完坑)

Loki是日志聚合系统,属于云原生技术,由Grafana Labs开发。它专注于轻量级和高效的日志管理,特别是适合Kubernetes环境。而Prometheus-operator则是用来管理Prometheus监控系统的,简化部署和配置,处理监控数据,尤其是指标(metrics)的收集和告警。 本片文档踩坑结束,使用…

Mybatis配置文件解析(详细)

引言 在了解Mybatis如何帮助客户进行数据的存取后&#xff0c;便对Mybatis的配置文件起了兴趣&#xff0c;在查阅官方文档后&#xff0c;总结了平时能用到的配置&#xff0c;希望能对大家有帮助 1.核心配置文件 主要是指Mybatis-config.xml中 其包含了会深深影响Mybatis行为…

技术迭代、流量困境与营销突破:基于开源AI大模型与S2B2C模式的创新路径研究

摘要&#xff1a;在技术指数级迭代与流量红利消退的双重背景下&#xff0c;营销领域面临边际效应递减与竞争升级的双重挑战。本文基于"开源AI大模型""AI智能名片""S2B2C商城""小程序源码"等创新工具&#xff0c;探讨营销范式转型的路径…

针对stm32F103C8t6芯片调节USB串口的经验

1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…