大家好,我是开车的阿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!