图论做题笔记:bfs

Leetcode - 433:最小基因变化

题目:

基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A''C''G''T' 之一。

假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。

  • 例如,"AACCGGTT" --> "AACCGGTA" 就是一次基因变化。

另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 bank 中)

给你两个基因序列 startend ,以及一个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果无法完成此基因变化,返回 -1

注意:起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中。

示例 1:

复制代码
输入:start = "AACCGGTT", end = "AACCGGTA", bank = ["AACCGGTA"]
输出:1

示例 2:

复制代码
输入:start = "AACCGGTT", end = "AAACGGTA", bank = ["AACCGGTA","AACCGCTA","AAACGGTA"]
输出:2

示例 3:

复制代码
输入:start = "AAAAACCC", end = "AACCCCCC", bank = ["AAAACCCC","AAACCCCC","AACCCCCC"]
输出:3

笔记:

这道题是真抽象,对字符串进行bfs,这里的思路是:直接对字符串去处理不要讲单个字符单独处理。首先建立一个处理队列,将start加入其中,此时队列中的元素表示未处理的元素,接下来记录当前层的大小,遍历当前层的元素(只有start一个),接着对字符串进行处理,这里我们创建一个数组来存储字符可变化的样子(也就是方向数组),从当前处理的字符串的头开始向后遍历,一一替换当前遍历到的位置,如果替换后的字符串可以在bank中找到并且没有被访问过我们就将其加入que的第二层,在遍历完当前层元素后step++代表变换元素的次数。

注意:

(1)当我们向队列加入一个元素后,立即将其标记为已访问。

(2)将vector类型的bank数组改为set数组更好处理:

在一个set数组中查找元素是否存在:set.count(目标)

cpp 复制代码
class Solution {
public:
    int minMutation(string startGene, string endGene, vector<string>& bank) {
        unordered_set<string> visited;
        unordered_set<string> bank_set(bank.begin(), bank.end());
        char keys[4] = {'A', 'C', 'G', 'T'};
        int step = 0;
        queue<string> que;
        que.push(startGene);
        visited.insert(startGene);
        while(!que.empty()){
            int size = que.size();
            for(int i = 0; i < size; i++){
                string cur = que.front();
                que.pop();
                if(cur == endGene){
                    return step;
                }
                for(int j = 0; j < cur.size(); j++){
                    for(int k = 0; k < 4; k++){
                        string next = cur;
                        next[j] = keys[k];
                        if(bank_set.count(next) && !visited.count(next)){
                            que.push(next);
                            visited.insert(next);
                        }
                    }
                }
            }
            step++;
        }
        return -1;
    }
};
相关推荐
Yawesh_best8 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
Ccjf酷儿10 小时前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
习习.y10 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
在逃热干面11 小时前
(笔记)自定义 systemd 服务
笔记
DKPT12 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
QT 小鲜肉14 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇
笔记·读书·孙子兵法
CoderYanger14 小时前
优选算法-队列+宽搜(BFS):72.二叉树的最大宽度
java·开发语言·算法·leetcode·职场和发展·宽度优先·1024程序员节
星轨初途15 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
QT 小鲜肉15 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇深度解析与现代应用
笔记·读书·孙子兵法
love530love17 小时前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui