leetcode刷题250天(68)——433. 最小基因变化(BFS)

该博客讨论了一种使用双端队列(deque)解决基因序列变化问题的方法。给定起始基因序列start、目标序列end和一个基因库bank,目标是找到使start变化为end的最少步骤。在每次迭代中,从队列中取出一个基因序列,检查所有可能的单字符替换,并将新序列加入队列,如果新序列有效且未被访问过。最终,如果找到目标序列,返回变化步数;否则,返回-1。这个问题涉及到生物信息学和算法优化。
摘要由CSDN通过智能技术生成

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

例如,“AACCGGTT” --> “AACCGGTA” 就是一次基因变化。
另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。

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

解题思路:
从start开始入队
元素出队 依次替换字符串中的每个值 看其是否存在于已访问元素集合内还是等于结束字符串
利用双端队列可以较为简单的解决问题

class Solution:
    def minMutation(self, start, end, bank):

        import collections
        CodeBook = ['A', 'C', 'G', 'T']
        # 双端队列
        queue = collections.deque()
        queue.append(start)
        # 已访问数据集合
        vis = set()
        step = 0

        while queue:
            size = len(queue)
            for i in range(size):
            # 出队
                cur = queue.popleft()

                if cur == end:
                    return step
				# 替换
                for i in range(len(cur)):
                    for j in CodeBook:
                        now = cur[:i] + j + cur[i + 1:]
                        # 比较
                        if now in bank and now not in vis:
                                queue.append(now)
                                vis.add(now)
            # 当前不是结尾 变换长度 + 1
            step += 1
		# 无对应 返回-1
        return -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值