基因序列可以表示为一条由 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