当前位置: 面试刷题>> 最小基因变化 (经典算法题500道)


### 题目描述补充 **题目:最小基因变化** 给定一个基因序列的开始字符串 `start` 和一个目标字符串 `end`,以及一个字符串数组 `bank`,其中 `bank[i]` 表示可能的基因变异序列。一个基因序列可以通过一个字符的变化(替换)变成另一个基因序列(即一次变异)。 编写一个函数来找出从 `start` 到 `end` 所需的最少变异次数。如果不可能从 `start` 变异到 `end`,则返回 -1。 **注意**: 1. 所有的基因序列都由小写字母组成,且长度相同。 2. 你可以假设 `start` 和 `end` 是非空的,且只包含小写字母。 3. `bank` 数组中的字符串都是唯一的。 4. 你可以假设 `start` 不在 `bank` 数组中。 ### 示例 **输入**: ``` start = "AACCGGTT" end = "AACCGGTA" bank = ["AACCGGTA"] ``` **输出**: 1 **解释**: 可以通过将第7个字符从 'T' 变为 'A' 来从 "AACCGGTT" 变异到 "AACCGGTA"。 ### PHP 示例代码 ```php function minMutation($start, $end, $bank) { if (!in_array($end, $bank)) return -1; $queue = new SplQueue(); $queue->enqueue([$start, 0]); // [当前字符串, 变异次数] $visited = array_fill_keys($bank, false); $visited[$start] = true; while (!$queue->isEmpty()) { [$current, $steps] = $queue->dequeue(); if ($current == $end) { return $steps; } for ($i = 0; $i < strlen($current); $i++) { $originalChar = $current[$i]; for ($j = 0; $j < 26; $j++) { $newChar = chr(ord('a') + $j); if ($originalChar == $newChar) continue; $newString = substr_replace($current, $newChar, $i, 1); if (!isset($visited[$newString]) && in_array($newString, $bank)) { $visited[$newString] = true; $queue->enqueue([$newString, $steps + 1]); } } } } return -1; } // 示例用法 $start = "AACCGGTT"; $end = "AACCGGTA"; $bank = ["AACCGGTA"]; echo minMutation($start, $end, $bank); // 输出: 1 ``` ### Python 示例代码 ```python from collections import deque def minMutation(start, end, bank): if end not in bank: return -1 queue = deque([(start, 0)]) visited = set(bank) visited.remove(start) while queue: current, steps = queue.popleft() if current == end: return steps for i in range(len(current)): original_char = current[i] for new_char in 'abcdefghijklmnopqrstuvwxyz': if new_char == original_char: continue new_string = current[:i] + new_char + current[i+1:] if new_string in visited: visited.remove(new_string) queue.append((new_string, steps + 1)) return -1 # 示例用法 start = "AACCGGTT" end = "AACCGGTA" bank = ["AACCGGTA"] print(minMutation(start, end, bank)) # 输出: 1 ``` ### JavaScript 示例代码 ```javascript function minMutation(start, end, bank) { if (!bank.includes(end)) return -1; const queue = [[start, 0]]; const visited = new Set(bank); visited.delete(start); while (queue.length > 0) { const [current, steps] = queue.shift(); if (current === end) { return steps; } for (let i = 0; i < current.length; i++) { const originalChar = current[i]; for (let j = 0; j < 26; j++) { const newChar = String.fromCharCode(97 + j); if (originalChar === newChar) continue; const newString = current.substring(0, i) + newChar + current.substring(i + 1); if (visited.has(newString)) { visited.delete(newString); queue.push([newString, steps + 1]); } } } } return -1; } // 示例用法 const start = "AACCGGTT"; const end = "AACCGGTA"; const bank = ["AACCGGTA"]; console.log(minMutation(start, end, bank)); // 输出: 1 ``` **码小课**网站中有更多关于算法和数据结构的内容分享给大家学习,包括详细解析和更多练习题目,帮助大家深入理解算法思想。
推荐面试题