每天一道leetcode:433. 最小基因变化(图论&中等&广度优先遍历)

这篇具有很好参考价值的文章主要介绍了每天一道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

提示

  • start.length == 8

  • end.length == 8

  • 0 <= bank.length <= 10

  • bank[i].length == 8

  • startendbank[i] 仅由字符 ['A', 'C', 'G', 'T'] 组成

题目思路

这道题广度优先的思路有点暴力搜索的意思,就是遍历所有的可能组合,然后找到最后的结果组合,找不到就返回-1,找得到就返回步数。具体来说,我们需要遍历所有8个位置的所有4个字母的组合,如果某个组合未被遍历过并且能在字典中找到,那么就放入bfs队列中,否则跳过,每层bfs结束step加一,直到找到最后结果。

注意:unodered_set插入使用emplace;使用visited集合标记遍历过的组合;第一个找到的就是最小的step,因为一起加加,所以第一个满足时就是结果了。

代码

class Solution 
{
public:    
    int minMutation(string start, string end, vector<string>& bank) 
    {
        unordered_set<string> dict; //存放字典信息
        unordered_set<string> visited;
        char chara[4]={'A','C','G','T'};        
        for(auto &b:bank) 
        {
            dict.emplace(b);
        }
        if(start==end) //剪枝,未变化
        {
            return 0;
        }
        if(!dict.count(end)) //如果变换后的组合不在字典中,那么无法实现变化,返回-1
        {
            return -1;
        }
        queue<string> p;
        p.push(start);
        visited.emplace(start);
        int step=1;
        //bfs
        while(!p.empty()) 
        {
            int n=p.size();
            for(int i=0;i<n;i++) 
            {
                string curr=p.front();
                p.pop();
                //遍历每位的所有可能的字母情况
                for(int j=0;j<8;j++) //遍历序列的8个位置
                {
                    for(int k=0;k<4;k++) //遍历4种字母
                    {
                        if(chara[k]!=curr[j]) //当前不是这个字母
                        {
                            string next=curr;
                            next[j]=chara[k];//在当前组合的基础上,将这个位置的字母改为当前字母
                            if(!visited.count(next)&&dict.count(next)) 
                            {
                                //可以加入的条件:在字典中能找到并且没有被遍历过
                                if(next==end) //找到最后的了,返回步数
                                {
                                    return step;
                                }
                                //还未找到最后
                                p.push(next);
                                visited.emplace(next);
                            }
                        }
                    }
                }
            }
            step++;//每完成一层就加一,与上个题一样
        }
        return -1;
    }
};

提交结果

每天一道leetcode:433. 最小基因变化(图论&中等&广度优先遍历),图论,leetcode,图论,算法,职场和发展,c++,数据结构,广度优先

欢迎大家在评论区讨论,如有不懂的部分,欢迎在评论区留言!

更新不易,宝子们点个赞支持下,谢谢!

每天一道leetcode,大家一起在评论区打卡呀!文章来源地址https://www.toymoban.com/news/detail-661426.html

到了这里,关于每天一道leetcode:433. 最小基因变化(图论&中等&广度优先遍历)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 每天一道leetcode:797. 所有可能的路径(图论&中等&深度优先遍历)

    每天一道leetcode:797. 所有可能的路径(图论&中等&深度优先遍历)

    给你一个有 n 个节点的 有向无环图(DAG) ,请你找出所有从节点 0 到节点 n-1 的路径并输出( 不要求按特定顺序 ) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j] 存在一条有向边)。 n == graph.length 2 = n = 15 0 = graph[i][j] n graph[i][j] != i (即不存

    2024年02月12日
    浏览(14)
  • 每天一道leetcode:1129. 颜色交替的最短路径(图论&中等&广度优先遍历)

    每天一道leetcode:1129. 颜色交替的最短路径(图论&中等&广度优先遍历)

    给定一个整数 n ,即有向图中的节点数,其中节点标记为 0 到 n - 1 。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges ,其中: redEdges[i] = [ai, bi] 表示图中存在一条从节点 ai 到节点 bi 的红色有向边, blueEdges[j] = [uj, vj] 表示图中存

    2024年02月13日
    浏览(11)
  • 每天一道leetcode:1926. 迷宫中离入口最近的出口(图论&中等&广度优先遍历)

    每天一道leetcode:1926. 迷宫中离入口最近的出口(图论&中等&广度优先遍历)

    给你一个 m x n 的迷宫矩阵 maze ( 下标从 0 开始 ),矩阵中有空格子(用 \\\'.\\\' 表示)和墙(用 \\\'+\\\' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。 每一步操作,你可以往 上 , 下 , 左 或者 右 移动一个格子。你不能进

    2024年02月12日
    浏览(9)
  • 每天一道leetcode:剑指 Offer 34. 二叉树中和为某一值的路径(中等&图论&深度优先遍历&递归)

    每天一道leetcode:剑指 Offer 34. 二叉树中和为某一值的路径(中等&图论&深度优先遍历&递归)

    给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 树中节点总数在范围 [0, 5000] 内 -1000 = Node.val = 1000 -1000 = targetSum = 1000 使用递归深度优先遍历,使用前序遍历,在遍历途

    2024年02月12日
    浏览(11)
  • 433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明)

    这道题可以看成一个24叉树。 因为基因序列长度固定为8,且每个位置的字母固定是AGCT,可以选择改变的只有3个字母,所以一次最多24种情况。 然后检查变化后的结果是否存在 bank 中(使用 hashSet 来存储),同时设置一个 visited 集合来检查是否访问过。 拓展:Queue使用ArrayL

    2024年02月02日
    浏览(7)
  • 每天一道leetcode:516. 最长回文子序列(动态规划&中等)

    每天一道leetcode:516. 最长回文子序列(动态规划&中等)

    给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 1 = s.length = 1000 s 仅由小写英文字母组成 动态规划 ,使用二维dp数组记录[i,j]间的最大回文子序列长度

    2024年02月13日
    浏览(11)
  • 每天一道leetcode:646. 最长数对链(动态规划&中等)

    每天一道leetcode:646. 最长数对链(动态规划&中等)

    给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti righti 。 现在,我们定义一种 跟随 关系,当且仅当 b c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链 。 找出并返回能够形成的 最长数对链的长度 。 你不需要用到所

    2024年02月12日
    浏览(10)
  • 每天一道leetcode:剑指 Offer 64. 求1+2+…+n(中等&递归)

    每天一道leetcode:剑指 Offer 64. 求1+2+…+n(中等&递归)

    求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等及条件判断语句(A?B:C)。 1 = n = 10000 使用递归,我们马上的想法是: 或者: 但是题目要求不能出现if、A?B:C这样的,所以,我们只能直接返回什么东西。返回什么?返回n。只不过n要进行自加

    2024年02月12日
    浏览(11)
  • 每天一道leetcode:剑指 Offer 13. 机器人的运动范围(中等&广度优先遍历&剪枝)

    每天一道leetcode:剑指 Offer 13. 机器人的运动范围(中等&广度优先遍历&剪枝)

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+

    2024年02月13日
    浏览(12)
  • 每天一道leetcode:127. 单词接龙(图论&困难&建图&广度优先遍历)

    每天一道leetcode:127. 单词接龙(图论&困难&建图&广度优先遍历)

    字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord - s1 - s2 - ... - sk : 每一对相邻的单词只差一个字母。 对于 1 = i = k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。 sk == endWord 给你两个单词 beginWord 和 endWord 和一个字典

    2024年02月12日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包