题解 | #基因变异最小次数#
基因变异最小次数
https://www.nowcoder.com/practice/ca6b659a3fde42c59276c9db98febd94
考察的知识点:哈希、双向广度优先搜索;
解答方法分析:
- 创建两个队列,分别存放起始基因序列和目标基因序列,以及两个哈希集合,分别存放起始基因序列访问过的序列和目标基因序列访问过的序列。
- 初始化变化次数为0。
- 进入循环,直到两个队列都为空。
- 在每次循环中,分别从起始基因队列和目标基因队列中取出一个基因序列。
- 对于起始基因序列,遍历该序列的每一个字符,将其替换为’A’、‘C’、'G’和’T’中的每一个,并判断替换后的基因是否有效且未被访问过。如果满足条件,则将该基因序列加入起始基因队列,并将其标记为已访问。
- 对于目标基因序列,遍历该序列的每一个字符,将其替换为’A’、‘C’、'G’和’T’中的每一个,并判断替换后的基因是否有效且未被访问过。如果满足条件,则将该基因序列加入目标基因队列,并将其标记为已访问。
- 在每次循环中,判断起始基因队列和目标基因队列中是否存在相同的基因序列。如果存在,则说明已经找到了最短变化路径,可以返回当前变化次数。
- 如果循环结束,说明无法完成基因变化,返回-1。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
int minMutation(string start, string end, vector<string>& bank) {
unordered_set<string> geneBank(bank.begin(), bank.end());
if (geneBank.find(end) == geneBank.end()) {
return -1;
}
queue<string> q;
q.push(start);
unordered_set<string> visited;
visited.insert(start);
int level = 0;
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
string cur = q.front();
q.pop();
if (cur == end) {
return level;
}
for (int j = 0; j < cur.size(); j++) {
char original = cur[j];
for (char c : {
'A', 'C', 'G', 'T'
}) {
cur[j] = c;
if (geneBank.count(cur) && visited.count(cur) == 0) {
q.push(cur);
visited.insert(cur);
}
}
cur[j] = original;
}
}
level++;
}
return -1;
}
};

