题解 | #基因变异最小次数#
基因变异最小次数
https://www.nowcoder.com/practice/ca6b659a3fde42c59276c9db98febd94
知识点
哈希,队列
解题思路
使用set来存放bank数组,队列来存放每一轮遍历的字符串。
遍历队列中的字符串,每次替换字符串中的一个字符,看是否在set中。
如果在set中表示可以继续修改,存放在队列中,此个字符串使用移除set中相应字符串。
当替换之后发现字符串与end相同则返回遍历队列的次数。
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) { // write code here int n = start.length(), m = end.length(); Set<String> set = new HashSet<>(Arrays.asList(bank)); if(!set.contains(end) || n != m){ return -1; } char[] charArr = new char[]{'A','C','G','T'}; Deque<String> deque = new LinkedList<>(); deque.offerFirst(start); int ans = 0; while(!deque.isEmpty()){ ans ++; int size = deque.size(); for (int i = 0; i < size; i++){ String s = deque.pollLast(); char[] sChar = s.toCharArray(); for(int j = 0; j < s.length(); j++){ char oldChar = sChar[j]; for(int l = 0; l < 4; l++){ if(charArr[l] == oldChar){ continue; } sChar[j] = charArr[l]; String newS = new String(sChar); if(newS.equals(end)){ return ans; } if(set.contains(newS)){ deque.offerFirst(newS); set.remove(newS); } } sChar[j] = oldChar; } } } return -1; } }