题解 | #基因变异最小次数#
基因变异最小次数
https://www.nowcoder.com/practice/ca6b659a3fde42c59276c9db98febd94
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param start string字符串 * @param end string字符串 * @param bank string字符串一维数组 * @return int整型 */ public int minMutation (String start, String end, String[] bank) { // write code here Set<String> bankSet = new HashSet<>(); for (String gene : bank) { bankSet.add(gene); } Queue<String> queue = new LinkedList<>(); Set<String> visited = new HashSet<>(); queue.offer(start); visited.add(start); int mutations = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { String curr = queue.poll(); if (curr.equals(end)) { return mutations; } char[] currArray = curr.toCharArray(); for (int j = 0; j < currArray.length; j++) { char originalChar = currArray[j]; for (char c : new char[] {'A', 'C', 'G', 'T'}) { currArray[j] = c; String nextGene = new String(currArray); if (bankSet.contains(nextGene) && !visited.contains(nextGene)) { queue.offer(nextGene); visited.add(nextGene); } } currArray[j] = originalChar; } } mutations++; } return -1; } }
知识点:
BFS、循环、遍历、队列、集合
解题分析:
使用了一个队列来进行广度优先搜索。首先,将起始序列加入队列,然后开始循环遍历队列。每次从队列中取出一个序列,将其与基因库中的序列进行比较,找到所有与当前序列仅有一个字符不同的序列,并将其加入队列。如果某个序列与目标序列相同,表示找到了最短变化次数,返回当前变化次数。如果队列为空仍然没有找到目标序列,说明无法完成基因变化,返回-1。
编程语言:
java