前往
大廳
主題

LeetCode - 433. Minimum Genetic Mutation 解題心得

Not In My Back Yard | 2022-11-07 12:00:12 | 巴幣 0 | 人氣 186

題目連結:


題目意譯:
一個基因字串可以被一個 8 字元長的字串所表示,其字元之選擇為 'A' 、 'C' 、 'G' 或 'T'。

假設我們需要進行從一個基因字串 start 突變到另一個基因字串 end 的調查,其中一次突變定義為在基因字串中單一一個字元之變化。

例如,"AACCGGTT" --> "AACCGGTA" 是一次的突變。
現在同時有一個基因銀行 bank,其將記錄著所有可行的基因突變。一個基因必須存在於銀行中才是合法的基因字串。

給定兩個基因字串 start 和 end 以及基因銀行 bank,回傳從 start 突變到 end 的最少所需步數。因為不存在這樣子的突變序列,回傳 -1。

注意一開始字串被「假設」為合法的字串,因此其有可能不會包含於 bank 之中。

限制:
start.length == 8
end.length == 8
0 ≦ bank.length ≦ 10
bank[i].length == 8
start 、 end 和 bank[i] 只由字元 ['A', 'C', 'G', 'T'] 組成。



範例測資:
範例 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


解題思維:
就是單純地從 start 這個字串開始廣度優先搜尋(Breadth First Search,BFS),即先算出 start 可以生出 bank 中哪些字串。窮舉每種變化即可。雖然每個字元只有 4 種選擇,使得可能性最多會有 4 ^ 8 個。但是 bank 的長度最大是 10,所以最多只會生出 10 個。

然後從第一步生出來的字串再疊代一次,形成第二步的那些字串(忽略已經出現過的,包含 start)。而期間如果遇到 end 這個字串,即代表當前步數即是所求最少步數;而如果 bank 中能被產生出來的字串都出來後也沒有 end 這個字串,則回傳 -1。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作