题解 | #基因变异最小次数#
基因变异最小次数
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

莉莉丝游戏公司福利 606人发布