A gene string can be represented by an 8-character long string, with choices from "A"
, "C"
, "G"
, "T"
.
Suppose we need to investigate about a mutation (mutation from "start" to "end"), where ONE mutation is defined as ONE single character changed in the gene string.
For example, "AACCGGTT"
-> "AACCGGTA"
is 1 mutation.
Also, there is a given gene "bank", which records all the valid gene mutations. A gene must be in the bank to make it a valid gene string.
Now, given 3 things - start, end, bank, your task is to determine what is the minimum number of mutations needed to mutate from "start" to "end". If there is no such a mutation, return -1.
Note:
- Starting point is assumed to be valid, so it might not be included in the bank.
- If multiple mutations are needed, all mutations during in the sequence must be valid.
- You may assume start and end string is not the same.
Example 1:
start: "AACCGGTT" end: "AACCGGTA" bank: ["AACCGGTA"] return: 1
Example 2:
start: "AACCGGTT" end: "AAACGGTA" bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"] return: 2
Example 3:
start: "AAAAACCC" end: "AACCCCCC" bank: ["AAAACCCC", "AAACCCCC", "AACCCCCC"] return: 3
本题和LeetCode 127. Word Ladder —— 单词接龙完全一样,没有任何区别,利用广度优先搜索查找最短路径。欣慰自己写代码一遍过,直接AC。
Java
class Solution { public int minMutation(String start, String end, String[] bank) { if (bank == null || bank.length == 0) return -1; char[] gen = {'A','C','G','T'}; HashSet<String> bankSet = new HashSet<>(); for (String s : bank) bankSet.add(s); Queue<String> q = new LinkedList<>(); HashMap<String, Integer> res = new HashMap<>(); res.put(start, 0); q.add(start); while (!q.isEmpty()) { String s = q.poll(); bankSet.remove(s); for (int i = 0; i < s.length(); i++) { char[] next = s.toCharArray(); for (char c : gen) { next[i] = c; String nextS = new String(next); if (bankSet.contains(nextS)) { res.put(nextS, res.get(s) + 1); if (nextS.equals(end)) return res.get(nextS); q.add(nextS); } } } } return -1; } }