最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • LeetCode题解:433. 最小基因变化,BFS+生成所有可能新基因再匹配,JavaScript,详细注释

    正文概述 掘金(LeeChen)   2021-01-31   608

    原题连接:leetcode-cn.com/problems/mi…

    解题思路:

    1. 理解题意:
      • 该题要求从bank中查找基因从start变化到end的最小次数。
      • 基因每次只能变化一个字符。
      • 变化的路径不是唯一的。
    2. 使用BFS:
      • 使用Set保存bank中的基因,如果其中的基因被使用过,则将其删除,可以避免重复选着。
      • 使用队列进行遍历,队列中按顺序存储了每一层的元素。
      • 每次循环时,将队列中当前层的元素依次取出,然后生成所有可能的基因变化情况。
      • 如果新生成的基因在Set中,表示它是下一步的变化,将其存入队列,同时从Set中删除。
      • 由于BFS是逐层进行遍历,一旦遇到有序列与目标序列相等,即为找到了最小变化次数,可以退出循环。
    3. 重要的Case:
    "AACCGGTT"
    "AACCGGTA"
    []
    
    "AACCGGTT"
    "AAACGGTA"
    ["AACCGATT","AACCGATA","AAACGATA","AAACGGTA"]
    
    "AAAACCCC"
    "CCCCCCCC"
    ["AAAACCCA","AAACCCCA","AACCCCCA","AACCCCCC","ACCCCCCC","CCCCCCCC","AAACCCCC","AACCCCCC"]
    
    "AAAAAAAA"
    "CCCCCCCC"
    ["AAAAAAAA","AAAAAAAC","AAAAAACC","AAAAACCC","AAAACCCC","AACACCCC","ACCACCCC","ACCCCCCC","CCCCCCCA"]
    
    /**
     * @param {string} start
     * @param {string} end
     * @param {string[]} bank
     * @return {number}
     */
    var minMutation = function (start, end, bank) {
      let level = 0; // 统计BFS遍历的深度
      let queue = [start]; // 在队列中存储起始基因序列,用于开始循环
      let bankSet = new Set(bank); // 存储未被访问过的基因序列
      let charBank = ['A', 'T', 'C', 'G']; // 每个基因可变化的字母
    
      // 不断遍历队列,直到队列为空时,完成BFS
      while (queue.length) {
        // 缓存当前队列中的元素数量,即为当前层的元素数量
        let queueLength = queue.length;
    
        // 进行queueLength次遍历
        while (--queueLength >= 0) {
          // 将队列中的当前基因出队
          const currGene = queue.pop();
    
          // 遍历当前基因的字母
          for (let i = 0; i < currGene.length; i++) {
            // 从当前可变化字母中寻找一个可用的字母
            for (let j = 0; j < charBank.length; j++) {
              // 避免生成与当前基因重复的序列
              if (charBank[j] === currGene[i]) {
                continue;
              }
    
              // 生成一个新基因序列
              const newGene = `${currGene.slice(0, i)}${
                charBank[j]
              }${currGene.slice(i + 1)}`;
    
              // 判断新基因是否使用
              if (bankSet.has(newGene)) {
                // 如果第一次发现,新基因与目标相同,表示查找到了最短变化路径
                if (newGene === end) {
                  // 由于当前变化没有被计数,返回结果时需要加1
                  return ++level;
                }
    
                // 将当前基因从Set中删除,表示其被访问过
                bankSet.delete(newGene);
                // 将当前基因存入数组,用于下一次变化
                queue.push(newGene);
              }
            }
          }
        }
    
        // 每完成一层遍历之后,变化数量就加1
        level++;
      }
    
      // 如果退出循环,表示未找到变化路径,直接返回-1
      return -1;
    };
    

    起源地下载网 » LeetCode题解:433. 最小基因变化,BFS+生成所有可能新基因再匹配,JavaScript,详细注释

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元