
Q: A gene string can be represented by an 8-character long string, with choices from 'A', 'C', 'G', and 'T'.
Suppose we need to investigate a mutation from a gene string start to a gene string end where one mutation is defined as one single character changed in the gene string.
- For example, "AACCGGTT" --> "AACCGGTA" is one mutation.
There is also a gene bank bank that records all the valid gene mutations. A gene must be in bank to make it a valid gene string.
Given the two gene strings start and end and the gene bank bank, return the minimum number of mutations needed to mutate from start to end. If there is no such a mutation, return -1.
Note that the starting point is assumed to be valid, so it might not be included in the bank.
A: BFS (Breadth-First Search)265Please respect copyright.PENANAXo2cq8DMUg
// better than use DFS as it just need to find out the shortest path.
class Solution {265Please respect copyright.PENANA68Palid5hv
public int minMutation(String start, String end, String[] bank) {265Please respect copyright.PENANAUMRBezPxb3
// Initialize a queue queue and a set seen. The queue will be used for BFS and the set will be used to prevent visiting a node more than once. Initially, the queue and set should hold start.265Please respect copyright.PENANAOzQhN2A9bx
Queue<String> queue = new LinkedList<>();265Please respect copyright.PENANAwNzIcpqfM6
Set<String> seen = new HashSet<>();265Please respect copyright.PENANAuwLEbvTazI
queue.add(start);265Please respect copyright.PENANABkihhpwLkv
seen.add(start);265Please respect copyright.PENANAfVETaCN2v9
265Please respect copyright.PENANAJpxf4sD4Lu
int steps = 0;265Please respect copyright.PENANAO0aiOIJV03
265Please respect copyright.PENANAtYFw97LGuj
while (!queue.isEmpty()) {265Please respect copyright.PENANAaP3YVKLaa8
int nodesInQueue = queue.size();265Please respect copyright.PENANAaOn8S4221U
for (int j = 0; j < nodesInQueue; j++) {265Please respect copyright.PENANArTMOlmpsAd
String node = queue.remove();265Please respect copyright.PENANABJ41R0h9vU
// Perform a BFS. At each node, if node == end, return the number of steps so far. Otherwise, iterate over all the neighbors. For each neighbor, if neighbor is not in seen and neighbor is in bank, add it to queue and seen.
if (node.equals(end)) {265Please respect copyright.PENANAhsWEaJzTCx
return steps;265Please respect copyright.PENANASZYOWCIyne
}
for (char c: new char[] {'A', 'C', 'G', 'T'}) {265Please respect copyright.PENANAaubJLCa1ib
for (int i = 0; i < node.length(); i++) {265Please respect copyright.PENANAaoQftss1Zi
String neighbor = node.substring(0, i) + c + node.substring(i + 1);265Please respect copyright.PENANAVdlZ3u9esh
if (!seen.contains(neighbor) && Arrays.asList(bank).contains(neighbor)) {265Please respect copyright.PENANAJ4LTsgA042
queue.add(neighbor);265Please respect copyright.PENANAeNsOQWKHPh
seen.add(neighbor);265Please respect copyright.PENANASQ7SvfF9VF
}265Please respect copyright.PENANAPxPSJpFAqH
}265Please respect copyright.PENANAxztON2mBMK
}265Please respect copyright.PENANA5ecnH8P4G2
}265Please respect copyright.PENANARc7ky624E3
265Please respect copyright.PENANABhj7pDKSJY
steps++;265Please respect copyright.PENANAc9bt6OkZcU
}265Please respect copyright.PENANAK3GUlghAmx
// If we finish the BFS and did not find end, return -1.265Please respect copyright.PENANAyVZwpZRi1k
return -1;265Please respect copyright.PENANAfdF2798QTt
}265Please respect copyright.PENANAsqnWc37c4C
}