一、知识点:
BFS、循环、遍历、队列、集合
二、文字分析:
使用了一个队列来进行广度优先搜索。首先,将起始序列加入队列,然后开始循环遍历队列。每次从队列中取出一个序列,将其与基因库中的序列进行比较,找到所有与当前序列仅有一个字符不同的序列,并将其加入队列。如果某个序列与目标序列相同,表示找到了最短变化次数,返回当前变化次数。如果队列为空仍然没有找到目标序列,说明无法完成基因变化,返回-1。
三、编程语言:
java
四、正确代码:
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) { Set<String> bankSet = new HashSet<>(Arrays.asList(bank)); if (!bankSet.contains(end)) { return -1; // 目标序列不在基因库中,无法变化 } Queue<String> queue = new LinkedList<>(); queue.offer(start); char[] genes = {'A', 'C', 'G', 'T'}; int level = 0; // 变化次数 while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { String seq = queue.poll(); // 如果当前序列与目标序列匹配,返回变化次数 if (seq.equals(end)) { return level; } char[] seqArr = seq.toCharArray(); for (int j = 0; j < seqArr.length; j++) { char originalGene = seqArr[j]; for (char gene : genes) { if (gene == originalGene) { continue; } seqArr[j] = gene; String newSeq = new String(seqArr); if (bankSet.contains(newSeq)) { queue.offer(newSeq); bankSet.remove(newSeq); // 确保不会重复访问已经入队列的序列 } } seqArr[j] = originalGene; // 恢复原始基因 } } level++; // 变化次数加一 } return -1; // 无法完成基因变化 } }