433. Minimum Genetic Mutation
- Hardness: \(\color{orange}\textsf{Medium}\)
- Ralated Topics:
Hash Table
、String
、Breadth-First Search
一、題目
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 bankbank
that records all the valid gene mutations. A gene must be inbank
to make it a valid gene string.
Given the two gene stringsstart
andend
and the gene bankbank
, return the minimum number of mutations needed to mutate fromstart
toend
. 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']
.
二、分析
- 用
BFS
的策略,可以找到最快到達的路徑。 - 相互比較 gene string 是否是相鄰(mutation),效率不如取代字元再去找是否存在路徑。
三、解題
1. BFS
- Time complexity: \(O(n)\)
- Space complexity: \(O(n)\)
const string code = "ATCG";
int minMutation(string start, string end, vector<string>& bank) {
unordered_set<string> set(bank.begin(), bank.end());
if (!set.count(end)) return -1;
queue<string> q;
q.push(start);
int cnt = 0;
while (!q.empty()) {
int sz = q.size();
while (sz--) {
string curr = q.front();
q.pop();
if (curr == end) return cnt;
set.erase(curr);
for (int i = 0; i < start.length(); i++) {
string tmp = curr;
for (char c : code){
tmp[i] = c;
if (set.count(tmp)) q.push(tmp);
}
}
}
cnt++;
}
return -1;
}