A gene string can be represented by an 8-character long string, with choices from 'A'
, 'C'
, 'G'
, and 'T'
.
Suppose we need to investigate a mutation from a gene string startGene
to a gene string endGene
where one mutation is defined as one single character changed in the gene string.
- For example,
"AACCGGTT" --> "AACCGGTA"
is one mutation.
There is also a gene bank bank
that records all the valid gene mutations. A gene must be in bank
to make it a valid gene string.
Given the two gene strings startGene
and endGene
and the gene bank bank
, return the minimum number of mutations needed to mutate from startGene
to endGene
. If there is no such a mutation, return -1
.
Note that the starting point is assumed to be valid, so it might not be included in the bank.
Example 1:
Input: startGene = "AACCGGTT", endGene = "AACCGGTA", bank = ["AACCGGTA"] Output: 1
Example 2:
Input: startGene = "AACCGGTT", endGene = "AAACGGTA", bank = ["AACCGGTA","AACCGCTA","AAACGGTA"] Output: 2
Constraints:
0 <= bank.length <= 10
startGene.length == endGene.length == bank[i].length == 8
startGene
,endGene
, andbank[i]
consist of only the characters['A', 'C', 'G', 'T']
.
ChatGPT's Solution:
from collections import deque class Solution: def minMutation(self, startGene: str, endGene: str, bank: List[str]) -> int: if endGene not in bank: return -1 bank = set(bank) # Convert list to set for O(1) lookup queue = deque([(startGene, 0)]) # (current_gene, mutation_steps) possible_chars = {'A', 'C', 'G', 'T'} while queue: current_gene, steps = queue.popleft() if current_gene == endGene: return steps for i in range(len(current_gene)): for char in possible_chars: if char != current_gene[i]: # Change one character mutated_gene = current_gene[:i] + char + current_gene[i+1:] if mutated_gene in bank: queue.append((mutated_gene, steps + 1)) bank.remove(mutated_gene) # Avoid revisiting return -1 # No valid mutation sequence found