Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 3d079dd

Browse files
solves #433: Minimum Genetic Mutation in java
1 parent f16c03f commit 3d079dd

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@
317317
| 422 | 🔒 [Valid Word Square](https://leetcode.com/problems/valid-word-square) | | |
318318
| 429 | 🔒 [N-ary Tree Level Order Traversal](https://leetcode.com/problems/n-ary-tree-level-order-traversal) | [![Java](assets/java.png)](src/NAryTreeLevelOrderTraversal.java) | |
319319
| 430 | [Flatten a Multilevel Doubly Linked List](https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list) | [![Java](assets/java.png)](src/FlattenAMultiLevelDoublyLinkedList.java) | |
320+
| 433 | [Minimum Genetic Mutation](https://leetcode.com/problems/minimum-genetic-mutation) | [![Java](assets/java.png)](src/MinimumGeneticMutation.java) | |
320321
| 434 | [Number of Segments in a String](https://leetcode.com/problems/number-of-segments-in-a-string) | [![Java](assets/java.png)](src/NumberOfSegmentsInString.java) [![Python](assets/python.png)](python/number_of_segments_in_a_string.py) | |
321322
| 441 | [Arranging Coins](https://leetcode.com/problems/arranging-coins) | [![Java](assets/java.png)](src/ArrangingCoins.java) [![Python](assets/python.png)](python/arranging_coins.py) | |
322323
| 443 | [String Compression](https://leetcode.com/problems/string-compression) | [![Java](assets/java.png)](src/StringCompression.java) [![Python](assets/python.png)](python/string_compression.py) | |

src/MinimumGeneticMutation.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// https://leetcode.com/problems/minimum-genetic-mutation
2+
// T: O(B)
3+
// S: O(1)
4+
5+
import java.util.ArrayList;
6+
import java.util.Collections;
7+
import java.util.HashMap;
8+
import java.util.HashSet;
9+
import java.util.LinkedList;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Queue;
13+
import java.util.Set;
14+
15+
public class MinimumGeneticMutation {
16+
private record Info(String mutation, int steps) {}
17+
18+
private static final char[] GENES = new char[] {'A', 'G', 'C', 'T'};
19+
20+
// n = length of string (8), m = possible number of characters
21+
// BFS, T: O(V + E) = O(nB + n^m * mn) S: O(n^m)
22+
public static int minMutation(String startGene, String endGene, String[] bank) {
23+
final Set<String> genePool = toSet(bank);
24+
if (!genePool.contains(endGene)) {
25+
return -1;
26+
}
27+
28+
final Queue<Info> queue = new LinkedList<>() {{ add(new Info(startGene, 0)); }};
29+
final Map<String, Integer> distances = new HashMap<>();
30+
31+
while (!queue.isEmpty()) {
32+
final Info info = queue.poll();
33+
if (distances.getOrDefault(info.mutation, Integer.MAX_VALUE) <= info.steps) {
34+
continue;
35+
}
36+
distances.put(info.mutation, info.steps);
37+
38+
for (String neighbour : validMutations(genePool, info.mutation)) {
39+
queue.add(new Info(neighbour, info.steps + 1));
40+
}
41+
}
42+
43+
return distances.getOrDefault(endGene, -1);
44+
}
45+
46+
// T: O(|s|), S: O(|s|)
47+
private static List<String> validMutations(Set<String> genePool, String s) {
48+
final List<String> result = new ArrayList<>();
49+
for (int i = 0 ; i < s.length() ; i++) {
50+
for (char c : GENES) {
51+
final String mutation = s.substring(0, i) + c + s.substring(i + 1);
52+
if (genePool.contains(mutation)) {
53+
result.add(mutation);
54+
}
55+
}
56+
}
57+
return result;
58+
}
59+
60+
// T: O(nB) S: O(nB)
61+
private static Set<String> toSet(String[] bank) {
62+
final Set<String> set = new HashSet<>();
63+
Collections.addAll(set, bank);
64+
return set;
65+
}
66+
}

0 commit comments

Comments
 (0)