LeeCode 433 最小基因变化

题目描述:

基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A''C''G''T' 之一。

假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。

  • 例如,"AACCGGTT" --> "AACCGGTA" 就是一次基因变化。

另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。

给你两个基因序列 start 和 end ,以及一个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果无法完成此基因变化,返回 -1 。

注意:起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中。

标签: 广度优先搜索,字符串比较

建立模型

本题的核心问题是寻找当前基因的所有可达基因序列(即一次基因变化得到的在基因库中的基因序列),然后依次迭代得到目标基因序列,并在迭代过程中记录变化次数。

编码实现

import queue

def minMutation(start: str, end: str, bank: List[str]) -> int:
if not (end in bank) or (len(start) != len(end)):
return -1
if not (start in bank):
bank.append(start) changes = 0
q = queue.Queue() # 使用队列存储可达基因序列和变化次数
used = set() # 集合保存到达过的基因序列,避免进入死循环
q.put((start, changes))
used.add(start) while not q.empty():
cur = q.get() # 弹出队首元组
for i in range(len(bank)):
if not (bank[i] in used) and compareTwoString(cur[0], bank[i]):
if bank[i] == end:
return cur[1] + 1
q.put((bank[i], cur[1] + 1))
used.append(bank[i])
return -1 def compareTwoString(str1: str, str2: str) -> bool:
"""
判断两个基因序列是否能通过一次基因变化得到
"""
if len(str1) != len(str2):
return False
count = 0
for i in range(len(str1)):
count += 1 if str1[i] != str2[i] else 0
return count == 1

LeeCode 433 最小基因变化的更多相关文章

  1. Leetcode 433.最小基因变化

    最小基因变化 一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 "A", "C", "G", "T"中的任 ...

  2. Java实现 LeetCode 433 最小基因变化

    433. 一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 "A", "C", "G", "T"中的任意一 ...

  3. [Swift]LeetCode433. 最小基因变化 | Minimum Genetic Mutation

    A gene string can be represented by an 8-character long string, with choices from "A", &qu ...

  4. [LeetCode] Minimum Genetic Mutation 最小基因变化

    A gene string can be represented by an 8-character long string, with choices from "A", &qu ...

  5. Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)

    和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...

  6. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  7. 广度优先搜索(BFS)解题总结

    定义 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法. 简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点. 如果所有节点均被访问,则算法中止. B ...

  8. 深度优先搜索(DFS)解题总结

    定义 深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 例如下图,其深度优先遍历顺序为 1->2->4-&g ...

  9. (转)基因芯片数据GO和KEGG功能分析

    随着人类基因组计划(Human Genome Project)即全部核苷酸测序的即将完成,人类基因组研究的重心逐渐进入后基因组时代(Postgenome Era),向基因的功能及基因的多样性倾斜.通过 ...

  10. Nature Biotechnology:人类基因研究走近平民 数据是基础解读更重要

    Nature Biotechnology:人类基因研究走近平民 数据是基础解读更重要 5万美元可以做什么?最近,美国斯坦福大学教授斯蒂芬·夸克在国际著名学术期刊<自然·生物技术>发表论文宣 ...

随机推荐

  1. Python 错误:ModuleNotFoundError: No module named 'conf'

    问题描述: 编译器无法使用cmd命令来执行py文件,结果可能报ModuleNotFoundError的错误. 比如在cmd任务栏执行:python E:\myProgram\Python\spider ...

  2. python3GUI--200行代码写一个上课点名程序(附源码)

    @ 目录 一.准备工作 1.Tkinter 2.PIL 二.预览 1.启动 2.开始点名-顺序点名 3.开始点名-随机点名 4.手动加载人名单 5.开始点名-顺序点名-Pyqt5版本 6.人名单格式 ...

  3. mysql 循环 例子

    mysql 循环生成数据demo: DROP PROCEDURE IF EXISTS test_insert; DELIMITER;; CREATE PROCEDURE test_insert() B ...

  4. api接口基础Day2

    精华笔记: 正则表达式: 用于描述字符串的内容格式,使用它通常用于匹配一个字符串是否符合格式要求 正则表达式的语法:-------------了解.不用纠结.不用深入研究 1.[]:表示一个字符,该字 ...

  5. 十大经典排序之桶排序(C++实现)

    桶排序 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定 思路: 根据数据规模,初始化合理桶数 将数列中的数据按照桶的规模进行映射,尽量保证数据被均匀的分布到桶 ...

  6. javaheima15 递归

    Java File 作用 创建对象定位文件,可以删除.获取文件信息等.但不能读写文件内容. 构建对象的方式 File file = new File("文件/文件/绝对路径/相对路径&quo ...

  7. 基于predis高并发情况下实现频率控制的函数

    /** * 频率控制函数 * @param string $product 保持唯一 * @param string $key 限制频率的维度 比如uid * @param int $millisec ...

  8. Bootstrap4布局(简要)

    目录 什么是Bootstrap 布局基础 布局容器 相应断点 z-index 网格系统 12栅格 重排序 列偏移 弹性盒子 什么是Bootstrap Bootstrap是目前最流行的一套前端开发框架, ...

  9. jenkins新建用户,设置权限

    jenkins新建用户,设置权限 一.新建用户 1.1 登录jenkins,点开 manage Jenkins 1.2进入Manage Users 1.3 新建用户 1.4填入新建用户信息 1.5用户 ...

  10. 5.Vue前后端交互

    一.前后端交互模式 1.1 接口调用方式 原生ajax 基于JQuery的ajax fetch axios 返回一个完整的HTML页面 也可以只返回特定格式的数据,比如json 1.2 URL地址格式 ...