【LeetCode】433. 最小基因变化

241 阅读2分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • start.length == 8
    • end.length == 8
    • 0 <= bank.length <= 10
    • bank[i].length == 8
    • start、end 和 bank[i] 仅由字符 ['A', 'C', 'G', 'T'] 组成

二、思路分析:

我们读取本题题意,要求对start字符串字母进行变化,计算出得到end字符串的变化次数。并且start字符串每一次变化的字符串,必须在bank列表里,才是有效的一次变动,所以我们可以明确如下几点:

  • bank 列表存放有效的字符串,每个字符串长度都为8,且字符都由['A', 'C', 'G', 'T']组成
  • start 字符串每一次变化,只变更一个字符
  • start 字符串变化为 end 字符串存在多种路径,但是要返回最少的次数

image.png

明确了题目的要求后,我们知道要start字符串的元素进行遍历,这个时候需要使用BFS方法

可能对于刚刚接触到的菜鸟比如我,什么是BFS遍历?

  • BFS是广度优先算法,属于一种盲目算法
  • 该算法的目的:遍历所有的节点,知道找到结果为止
  • 使用队列来添加已遍历的节点

image.png

  • 定义队列que,初始化记录gene,step = start,0
  • 循环对start字符串中的字符串进行每一次更改("ACGT")得到的newgene,都需要判断在bank列表中
  • 如果newgene在bank中,则que把newgene添加到列表,步骤➕1,bank去掉newgene
  • que列表推出添加newgene,如果newgene与end相等,则返回step
  • 直到que为空,如果仍然没有找到有效的,则返回-1

image.png

我们借助collections.deque()形式实现,python代码如下:

class Solution(object):
    def minMutation(self, start, end, bank):
        """
        :type start: str
        :type end: str
        :type bank: List[str]
        :rtype: int
        """
        bfs = collections.deque()
        bfs.append((start, 0))
        bankset = set(bank)
        while bfs:
            gene, step = bfs.popleft()
            if gene == end:
                return step
            for i in range(len(gene)):
                for x in "ACGT":
                    newGene = gene[:i] + x + gene[i+1:]
                    if newGene in bank and newGene != gene:
                        bfs.append((newGene, step + 1))
                        bank.remove(newGene)
        return -1

三、总结:

本题使用BFS思想,需要借助collection.deque()来实现,start字符串的字符进行"ACGT"变更,符合bank列表中,则添加到队列中,并且bank列表中删除遇到过的字符串。

image.png

  • 时间复杂度O(N*L),N 为bank列表的长度,L为基因长度
  • 空间复杂度O(N)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~