返回

大招:LeetCode题解:433. 最小基因变化,JS版

前端

在LeetCode题解系列中,我们今天要研究的是第433题:最小基因变化。在这道题中,你需要找出从一个基因到另一个基因的最短变化路径。你可以每次改变一个字符,而且变化的路径并不是唯一的。

为了解决这个问题,我们使用BFS(广度优先搜索)算法和生成所有可能的新基因的方式。我们首先将起始基因放入队列中,然后逐层扩展队列,直到找到目标基因或队列为空。在每次扩展队列时,我们生成所有可能的新基因,并将它们放入队列中。如果新基因已经在队列中,则将其删除。

我们使用Set来保存bank中的基因,如果其中的基因被使用过,则将其删除,这样可以避免重复选择。队列中按顺序存储了每一层的元素。每次循环时,我们将队列中所有元素出队列,然后生成所有可能的新基因,并将它们放入队列中。如果新基因已经在队列中,则将其删除。

我们重复这个过程,直到找到目标基因或队列为空。如果队列为空,则表示没有找到从起始基因到目标基因的路径。如果找到了目标基因,则返回变化的次数。

以下是一个JavaScript代码的示例,展示了如何使用BFS和生成所有可能的新基因的方式来解决LeetCode题解433:

/**
 * Given two strings start and end, return the minimum number of steps to transform start to end.
 * You can change one character of start at a time, and the new character must be present in the given dictionary.
 * Return -1 if there is no such transformation.
 *
 * @param {string} start
 * @param {string} end
 * @param {string[]} bank
 * @return {number}
 */
const minMutation = (start, end, bank) => {
  // Create a set to store the genes in the bank.
  const geneBank = new Set(bank);

  // Create a queue to store the genes that need to be explored.
  const queue = [start];

  // Create a set to store the genes that have been visited.
  const visited = new Set();

  // The number of transformations required to reach the target gene.
  let transformations = 0;

  // While there are genes in the queue and the target gene has not been found, continue the search.
  while (queue.length > 0 && !visited.has(end)) {
    // Get the size of the current level of the BFS.
    const levelSize = queue.length;

    // For each gene in the current level, explore all possible transformations.
    for (let i = 0; i < levelSize; i++) {
      // Get the current gene.
      const gene = queue.shift();

      // Mark the current gene as visited.
      visited.add(gene);

      // Generate all possible new genes by changing one character.
      for (let j = 0; j < gene.length; j++) {
        for (let k = 0; k < 26; k++) {
          // Create a new gene by changing the character at index j to the character at index k.
          const newGene = gene.substring(0, j) + String.fromCharCode(97 + k) + gene.substring(j + 1);

          // If the new gene is in the bank and has not been visited, add it to the queue.
          if (geneBank.has(newGene) && !visited.has(newGene)) {
            queue.push(newGene);
          }
        }
      }
    }

    // Increment the number of transformations.
    transformations++;
  }

  // If the target gene was found, return the number of transformations. Otherwise, return -1.
  return visited.has(end) ? transformations : -1;
};

我希望这篇LeetCode题解能帮助你理解如何使用BFS和生成所有可能的新基因的方式来解决最小基因变化问题。