一、知识点:

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; // 无法完成基因变化
    }
}