
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)242Please respect copyright.PENANA7QnMaPOWLc
// better than use DFS as it just need to find out the shortest path.
class Solution {242Please respect copyright.PENANAJTOha8miM8
public int minMutation(String start, String end, String[] bank) {242Please respect copyright.PENANA5yX72dYZvW
// 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.242Please respect copyright.PENANAqPdl93wvfu
Queue<String> queue = new LinkedList<>();242Please respect copyright.PENANAa8BqX7mjTA
Set<String> seen = new HashSet<>();242Please respect copyright.PENANAKzOLSZKt8F
queue.add(start);242Please respect copyright.PENANALWG7QV2Gsd
seen.add(start);242Please respect copyright.PENANAspFriZCDUb
242Please respect copyright.PENANAfNcRvZm0Ta
int steps = 0;242Please respect copyright.PENANA0wntkrWSSJ
242Please respect copyright.PENANApoUsp5A1YK
while (!queue.isEmpty()) {242Please respect copyright.PENANAIXrQK0mGWF
int nodesInQueue = queue.size();242Please respect copyright.PENANAPm8eLJlXdx
for (int j = 0; j < nodesInQueue; j++) {242Please respect copyright.PENANAddyAbG5ZU1
String node = queue.remove();242Please respect copyright.PENANAhqxARvPuzM
// 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)) {242Please respect copyright.PENANAKlGDOFrELO
return steps;242Please respect copyright.PENANAsLRJQHjoQo
}
for (char c: new char[] {'A', 'C', 'G', 'T'}) {242Please respect copyright.PENANAtUXte1PR6l
for (int i = 0; i < node.length(); i++) {242Please respect copyright.PENANAOHkq2iWNDD
String neighbor = node.substring(0, i) + c + node.substring(i + 1);242Please respect copyright.PENANAlEvu4xYE2M
if (!seen.contains(neighbor) && Arrays.asList(bank).contains(neighbor)) {242Please respect copyright.PENANAGFPbjsDomu
queue.add(neighbor);242Please respect copyright.PENANAMzvvUOyWXY
seen.add(neighbor);242Please respect copyright.PENANAUa7s60gHSG
}242Please respect copyright.PENANAqDIX866PA4
}242Please respect copyright.PENANAzWQDNF27w7
}242Please respect copyright.PENANARY7sFAdWNZ
}242Please respect copyright.PENANAzyB74ibNuX
242Please respect copyright.PENANAIjweZV10OB
steps++;242Please respect copyright.PENANAc3Hwg3vu3C
}242Please respect copyright.PENANALpGuPv4S0U
// If we finish the BFS and did not find end, return -1.242Please respect copyright.PENANAJOu6vUcNX7
return -1;242Please respect copyright.PENANAuE1gqQZ1Ys
}242Please respect copyright.PENANASiZKeM9sAR
}