大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目解答方法的文字分析
我们可以使用广度优先搜索算法来解决这个问题。首先,我们将 start 添加到队列中,并设置一个变化次数为0的变量。然后,我们开始进行广度优先搜索,每次从队列中取出一个基因序列,并尝试将该基因序列的每个字符分别变化成 'A'、'C'、'G' 和 'T',并查看是否能得到一个在基因库中的新的基因序列。如果能得到新的基因序列,则将其添加到队列中,并将变化次数加1。我们继续这个过程,直到队列为空,或者找到了目标基因序列 end。如果找到了目标基因序列 end,则返回变化次数作为答案;如果队列为空,说明无法完成基因变化,返回 -1。
本题解析所用的编程语言 (C++)
C++
完整且正确的编程代码
class Solution { public: int minMutation(string start, string end, vector<string>& bank) { unordered_set<string> bankSet(bank.begin(), bank.end()); // 将基因库转换为哈希集合 queue<string> q; unordered_set<string> visited; q.push(start); visited.insert(start); int mutations = 0; // 变化次数 while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; ++i) { string curr = q.front(); q.pop(); if (curr == end) { return mutations; // 找到了目标基因序列,返回变化次数 } for (int j = 0; j < curr.length(); ++j) { char originalChar = curr[j]; for (char c : {'A', 'C', 'G', 'T'}) { curr[j] = c; // 尝试将当前字符变成 'A'、'C'、'G' 和 'T' // 判断变化后的基因序列是否在基因库中且未被访问过 if (bankSet.find(curr) != bankSet.end() && visited.find(curr) == visited.end()) { q.push(curr); // 将变化后的基因序列加入队列 visited.insert(curr); // 标记为已访问 } } curr[j] = originalChar; // 恢复当前字符 } } mutations++; // 增加变化次数 } return -1; // 无法完成基因变化,返回 -1 } };
在上面的代码中,我们使用了一个哈希集合 bankSet
来存储基因库中的基因序列,使用一个队列 q
来进行广度优先搜索,使用一个哈希集合 visited
来记录已经访问过的基因序列。我们首先将 start 添加到队列中,并设置一个变化次数为 0。
然后,我们开始进行广度优先搜索。我们每次从队列中取出一个基因序列 curr
,并尝试将该基因序列的每个字符分别变化成 'A'、'C'、'G' 和 'T',并查看是否能得到一个在基因库中的新的基因序列。如果能得到新的基因序列,则将其添加到队列中,并将变化次数加 1。我们继续这个过程,直到队列为空,或者找到了目标基因序列 end。
如果找到了目标基因序列 end,则返回变化次数作为答案。如果队列为空,说明无法完成基因变化,返回 -1。
由于在整个过程中,我们只对每个基因序列进行了一次变化,并且每个基因序列只会入队列一次,所以时间复杂度为 O(n*m),其中 n 表示基因库中的基因序列数量,m 表示基因序列的长度。
您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!