Leetcode 433.最小基因變化
阿新 • • 發佈:2019-01-09
最小基因變化
一條基因序列由一個帶有8個字元的字串表示,其中每個字元都屬於 "A", "C", "G", "T"中的任意一個。
假設我們要調查一個基因序列的變化。一次基因變化意味著這個基因序列中的一個字元發生了變化。
例如,基因序列由"AACCGGTT" 變化至 "AACCGGTA" 即發生了一次基因變化。
與此同時,每一次基因變化的結果,都需要是一個合法的基因串,即該結果屬於一個基因庫。
現在給定3個引數 — start, end, bank,分別代表起始基因序列,目標基因序列及基因庫,請找出能夠使起始基因序列變化為目標基因序列所需的最少變化次數。如果無法實現目標變化,請返回 -1。
注意:
- 起始基因序列預設是合法的,但是它並不一定會出現在基因庫中。
- 所有的目標基因序列必須是合法的。
- 假定起始基因序列與目標基因序列是不一樣的。
示例 1:
start: "AACCGGTT"
end: "AACCGGTA"
bank: ["AACCGGTA"]
返回值: 1
示例 2:
start: "AACCGGTT"
end: "AAACGGTA"
bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"]
返回值: 2
示例 3:
start: "AAAAACCC"
end: "AACCCCCC"
bank: ["AAAACCCC", "AAACCCCC", "AACCCCCC"]
返回值: 3
利用廣度優先搜尋查詢最短路徑
1 import java.util.HashMap; 2 import java.util.HashSet; 3 import java.util.LinkedList; 4 import java.util.Queue; 5 6 7 class Solution { 8 public int minMutation(String start, String end, String[] bank) {9 if (bank == null || bank.length == 0) return -1; 10 char[] gen = {'A','C','G','T'}; 11 HashSet<String> bankSet = new HashSet<>(); 12 for (String s : bank) 13 bankSet.add(s); 14 Queue<String> q = new LinkedList<>(); 15 HashMap<String, Integer> res = new HashMap<>(); 16 res.put(start, 0); 17 q.add(start); 18 while (!q.isEmpty()) { 19 String s = q.poll(); 20 bankSet.remove(s); 21 for (int i = 0; i < s.length(); i++) { 22 char[] next = s.toCharArray(); 23 for (char c : gen) { 24 next[i] = c; 25 String nextS = new String(next); 26 if (bankSet.contains(nextS)) { 27 res.put(nextS, res.get(s) + 1); 28 if (nextS.equals(end)) return res.get(nextS); 29 q.add(nextS); 30 } 31 } 32 } 33 } 34 return -1; 35 } 36 }