题目-中等难度
基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 ‘A’、‘C’、‘G’ 和 ‘T’ 之一。
假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。
例如,“AACCGGTT” --> “AACCGGTA” 就是一次基因变化。
另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 bank 中)
给你两个基因序列 start 和 end ,以及一个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果无法完成此基因变化,返回 -1 。
- 注意:起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中。
示例
示例 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
提示:
- start.length == 8
- end.length == 8
- 0 <= bank.length <= 10
- bank[i].length == 8
- start、end 和 bank[i] 仅由字符 [‘A’, ‘C’, ‘G’, ‘T’] 组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. bfs
时间
36ms
击败 92.59%使用 Python3 的用户
内存
15.71MB
击败 30.56%使用 Python3 的用户
class Solution:
def minMutation(self, startGene: str, endGene: str, bank: List[str]) -> int:
# 确保基因库中没有重复基因
bank = set(bank)
# 如果最终目标基因没有存在于库中,直接返回-1
if endGene not in bank:
return -1
# 将初始基因和步骤数作为起步
q = [(startGene,0)]
# 每个字母的可能变化
change = {'A':'TCG','T':'ACG','C':'ATG','G':'ATC'}
# 基因开始变更
while q:
# 获取基因和步骤数
node, step = q.pop(0)
# 如果当前基因就是目标基因, 那么返回步骤数
if node==endGene:
return step
# 如果不是, 对基因进行审核, i为当前字母索引, v为当前字母
for i,v in enumerate(node):
# 对于字母变化的范围进行遍历
for j in change[v]:
# 组成新基因
new = node[:i]+j+node[i+1:]
# 判断新基因是否存在于基因库中
if new in bank:
# 如果存在, 将新基因存于q中方便下一轮遍历
q.append((new,step+1))
# 基因库中同时移除该基因, 防止重复
bank.remove(new)
# 最终没有返回步数则证明没有找到, 返回-1
return -1