433 Minimum Genetic Mutation
1. Question
start: "AACCGGTT"
end: "AACCGGTA"
bank: ["AACCGGTA"]
return: 12. Implementation
3. Time & Space Complexity
Last updated
start: "AACCGGTT"
end: "AACCGGTA"
bank: ["AACCGGTA"]
return: 1Last updated
start: "AACCGGTT"
end: "AAACGGTA"
bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"]
return: 2start: "AAAAACCC"
end: "AACCCCCC"
bank: ["AAAACCCC", "AAACCCCC", "AACCCCCC"]
return: 3class Solution {
public int minMutation(String start, String end, String[] bank) {
Set<String> sequences = new HashSet<>();
char[] code = {'A', 'C', 'G', 'T'};
for (String seq : bank) {
sequences.add(seq);
}
int level = 0;
Set<String> visited = new HashSet<>();
Queue<String> queue = new LinkedList<>();
queue.add(start);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
String curGene = queue.remove();
if (curGene.equals(end)) {
return level;
}
char[] letters = curGene.toCharArray();
for (int j = 0; j < letters.length; j++) {
char oldC = letters[j];
for (char c : code) {
letters[j] = c;
String nextGene = new String(letters);
if (sequences.contains(nextGene) && !visited.contains(nextGene)) {
visited.add(nextGene);
queue.add(nextGene);
}
}
letters[j] = oldC;
}
}
++level;
}
return -1;
}
}class Solution {
public int minMutation(String start, String end, String[] bank) {
if (start.length() != end.length()) {
return -1;
}
Set<String> sequences = new HashSet<>();
char[] code = {'A', 'C', 'G', 'T'};
for (String seq : bank) {
sequences.add(seq);
}
if (!sequences.contains(end)) {
return -1;
}
int level = 0;
Set<String> visited = new HashSet<>();
Set<String> beginSet = new HashSet<>();
Set<String> endSet = new HashSet<>();
beginSet.add(start);
endSet.add(end);
Set<String> temp = null;
while (!beginSet.isEmpty() && !endSet.isEmpty()) {
System.out.println("beginSet size: " + beginSet.size() + " endSet size: " + endSet.size());
if (beginSet.size() >= endSet.size()) {
temp = beginSet;
beginSet = endSet;
endSet = temp;
}
temp = new HashSet<>();
for (String gene : beginSet) {
char[] letters = gene.toCharArray();
for (int i = 0; i < letters.length; i++) {
char oldC = letters[i];
for (char c : code) {
if (c == oldC) continue;
letters[i] = c;
String nextGene = new String(letters);
if (endSet.contains(nextGene)) {
return level + 1;
}
if (sequences.contains(nextGene) && !visited.contains(nextGene)) {
visited.add(nextGene);
temp.add(nextGene);
}
}
letters[i] = oldC;
}
}
beginSet = temp;
++level;
}
return -1;
}
}