题目: 433. 最小基因变化

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

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

例如,基因序列由"AACCGGTT" 变化至 "AACCGGTA" 即发生了一次基因变化。

与此同时,每一次基因变化的结果,都需要是一个合法的基因串,即该结果属于一个基因库。

现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。

注意:

  1. 起始基因序列默认是合法的,但是它并不一定会出现在基因库中。
  2. 所有的目标基因序列必须是合法的。
  3. 假定起始基因序列与目标基因序列是不一样的。

示例 1:

start: "AACCGGTT"
end:   "AACCGGTA"
bank: ["AACCGGTA"]
返回值: 1
复制代码

示例 2:

start: "AACCGGTT"
end:   "AAACGGTA"
bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"]返回值: 2
复制代码

示例 3:

start: "AAAAACCC"
end:   "AACCCCCC"
bank: ["AAAACCCC", "AAACCCCC", "AACCCCCC"]返回值: 3
复制代码

解题思路:

可以把这道题转换成一个图的最短路径计算,这样的话题目就简单的多了.

通过BFS(广度优先搜索),比较两个字符串如果只差1个字符,则生成一条树边,最后只需要找到 end 的深度就可以了.

class Solution {let map: [Character:Int] = ["A":0b00,"C":0b01,"G":0b10,"T":0b11]///字符串转 Intfunc str2Int(_ s: String) -> Int {return s.map{ map[$0]! }.reduce(0) { $0 << 2 + $1 }}func isOneStepMutation(_ g1: Int, _ g2: Int) -> Bool {var count = 0var base = 0xC000for _ in 1 ... 8 {if (g1 & base) != (g2 & base) {count += 1}base >>= 2}return count == 1}func minMutation(_ start: String, _ end: String, _ bank: [String]) -> Int {var mutation = 0let bankIntList = bank.map{str2Int($0)}let startInt = str2Int(start)let endInt = str2Int(end)var currentBankList = bankIntList.filter{$0 != startInt}var currentStartList = [startInt]var nextStartList = [Int](), nextBankList = [Int]()while !currentBankList.isEmpty && !currentStartList.isEmpty {let startInt = currentStartList.removeFirst()for bankOne in currentBankList {if isOneStepMutation(bankOne, startInt) {if bankOne == endInt {return mutation + 1}else {nextStartList.append(bankOne)}}else{nextBankList.append(bankOne)}}if currentStartList.isEmpty {currentStartList = nextStartListcurrentBankList = nextBankListnextBankList.removeAll()nextStartList.removeAll()mutation += 1}}return -1}
}
复制代码

leetcode 结果

Runtime: 4 ms, faster than 100.00% of Swift online submissions for Minimum Genetic Mutation.
Memory Usage: 21.5 MB, less than 50.00% of Swift online submissions for Minimum Genetic Mutation.
复制代码

转载于:https://juejin.im/post/5cd550f8e51d45475f4de2d1

[Swift][leetcode] 433. 最小基因变化相关推荐

  1. LeetCode 433. 最小基因变化(广度优先搜索)

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

  2. LeetCode 433 最小基因变化

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

  3. 力扣(LeetCode)433. 最小基因变化(2023.03.07)

    基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A'.'C'.'G' 和 'T' 之一. 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化.一次基因变化就意 ...

  4. leetcode 433. Minimum Genetic Mutation | 433. 最小基因变化(图的DFS)

    题目 https://leetcode.com/problems/minimum-genetic-mutation/ 题解 图的 DFS,思路见草稿: class Solution {int N;pu ...

  5. 【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁

  6. 第 258 场周赛(5867. 反转单词前缀/ 5868. 可互换矩形的组数 / 5869. 两个回文子序列长度的最大乘积(状态压缩) / 5870. 每棵子树内缺失的最小基因值(小大合并))

    第 258 场周赛 从这次开始还是把题目加上名字吧,要不然想找找不到题,哈哈 字节的周赛,还想冲个200来着,最后一题按二叉树写的,用例还能过,一提交,发现多叉的...来不及改了..400多名 586 ...

  7. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)

    题目 leetcode 64. 最小路径和 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i ...

  8. LeetCode 1631. 最小体力消耗路径(DFS + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你准备参加一场远足活动.给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row ...

  9. leetcode最小面积_Code Review Swift 算法题: 最小面积矩形  Leetcode 的动人之处

    题目描述: 939. 最小面积矩形 给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1: 输入:[[1,1 ...

  10. 93. Leetcode 64. 最小路径和 (动态规划-路径规划)

    步骤一.确定状态: 1.确定原问题中变化的变量个数 2.考虑最后一步 右下角坐标设为(m-1,n-1) 那么前一步一定是在(m-2,n-1)或者(m-1,n-2) 步骤二.推断状态方程: f[i][j ...

最新文章

  1. 计算机项目管理报告,《软件项目管理》报告.doc
  2. python自动化干什么-高效工作,拒绝加班,看Python自动化功能到底有多强大
  3. [codeforces 508E]Maximum Matching
  4. shell循环结构之while循环
  5. 资源放送丨《 Kubernetes Operator 开发范式》PPT视频
  6. 第一次总结:整体框架
  7. matlab猜数字游戏程序,matlab 猜数字小游戏
  8. 博客营销为何这么神奇而不被淘汰的
  9. html文件类型怎么改,更改文件类型,教您文件类型如何更改
  10. 【已解决】vue报错:Parsing error: No Babel config file detected for...
  11. html实现让电脑断网的功能,简单几步,即可实现电脑自动断网
  12. win7升级win10正式版_如何使用小白系统对win7升级win10操作
  13. excel表格横向纵向变换_Excel操作技巧:简单3步,搞定数据统计和分析!
  14. 最新主流大数据技术分类大全(持续更新)
  15. Python的自我修炼之路(一)
  16. 算法学习-回溯法(2)0/1背包问题求解
  17. 关于ASA5520防火墙搭配WEB服务器的非常规设置
  18. 2021年双十一活动,淘宝/天猫喵糖/京东双11任务自动助手软件+淘宝/京东/拼多多/抖音/直播抢购软件,分享代码
  19. 大文件传输有哪些方式可用?大文件传输有哪些方式?
  20. 重磅:国产 SegmentFault 被收购。。

热门文章

  1. 剥开比原看代码03:比原是如何监听p2p端口的
  2. SQL Fundamentals || DCL(Data Control Language) || 用户管理Profile概要文件
  3. BootStrap_04之jQuery插件(导航、轮播)、以及Less
  4. XCL-Charts图表库中柱形图的同源风格切换介绍
  5. DELPHI XE5 FOR ANDROID 模仿驾考宝典 TMEMO 控件随着字数增多自动增高
  6. CSS设置居屏幕中间的弹出块
  7. C++ getline在VC6.0的一个bug(处理方法)(转)
  8. OUTEROS常用命令
  9. 学习 trajectory.txt
  10. Spring动态的切换数据源