Minimum Genetic Mutation

MediumHash TableStringBreadth-First Search

Solution

export function minMutation(startGene: string, endGene: string, bank: string[]): number {
  const geneBank = new Set(bank);
  const changeGene = (gene: string, g: string, i: number) =>
    gene.substring(0, i) + g + gene.substring(i + 1);
 
  function bfs() {
    let queue: [string, number][] = [[startGene, 0]];
    const visited = new Set([startGene]);
 
    while (0 < queue.length) {
      const nextQueue: [string, number][] = [];
 
      for (const [currentGene, currentStep] of queue) {
        if (currentGene === endGene) {
          return currentStep;
        }
 
        for (const g of 'ACGT') {
          for (let i = 0; i < currentGene.length; i++) {
            const neighborGene = changeGene(currentGene, g, i);
            if (!visited.has(neighborGene) && geneBank.has(neighborGene)) {
              nextQueue.push([neighborGene, currentStep + 1]);
              visited.add(neighborGene);
            }
          }
        }
      }
 
      queue = nextQueue;
    }
 
    return -1;
  }
 
  return bfs();
}