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 start
to a gene string end
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 start
and end
and the gene bank bank
, return the minimum number of mutations needed to mutate from start
to end
. 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: start = "AACCGGTT", end = "AACCGGTA", bank = ["AACCGGTA"] Output: 1
Example 2:
Input: start = "AACCGGTT", end = "AAACGGTA", bank = ["AACCGGTA","AACCGCTA","AAACGGTA"] Output: 2
Example 3:
Input: start = "AAAAACCC", end = "AACCCCCC", bank = ["AAAACCCC","AAACCCCC","AACCCCCC"] Output: 3
Constraints:
start.length == 8
end.length == 8
0 <= bank.length <= 10
bank[i].length == 8
start
,end
, andbank[i]
consist of only the characters['A', 'C', 'G', 'T']
.
Companies:
Google
Related Topics:
Hash Table, String, Breadth-First Search
Similar Questions:
// OJ: https://leetcode.com/problems/minimum-genetic-mutation/
// Author: github.com/lzl124631x
// Time: O(NWC) where `N` is the length of `bank`, `W` is the length of `bank[i]`, and `C` is the number of genes.
// Space: O(NW)
class Solution {
public:
int minMutation(string start, string end, vector<string>& bank) {
queue<string> q{{start}};
unordered_set<string> st(bank.begin(), bank.end()), seen{start};
char c[4] = {'A', 'C', 'G', 'T'};
int step = 0;
while (q.size()) {
int cnt = q.size();
while (cnt--) {
auto s = q.front();
q.pop();
if (s == end) return step;
for (int i = 0; i < s.size(); ++i) {
for (int j = 0; j < 4; ++j) {
if (c[j] == s[i]) continue;
char tmp = s[i];
s[i] = c[j];
if (st.count(s) && seen.count(s) == 0) {
seen.insert(s);
q.push(s);
}
s[i] = tmp;
}
}
}
++step;
}
return -1;
}
};