題目連結:
題目意譯:
藉由一個字典 wordList 從字詞 beginWord 轉到字詞 endWord 的一個變換序列為一個字詞之序列 beginWord → s1 → s2 → …… → sk 使得
每個相鄰之字詞對只有一個字元相異。
對於 1 ≦ i ≦ k 的每個 si 皆存在於 wordList 中。注意 beginWord 可以不必出現於 wordList 中。
sk == endWord
給定兩個字詞 beginWord 和 endWord 以及一個字典 wordList,回傳所有從 beginWord 變到 endWord 的最短變換序列,如果不存在這樣子的序列則回傳空列表。每個序列應以一個字詞列表 [beginWord, s1, s2, ..., sk] 回傳。
限制:
1 ≦ beginWord.length ≦ 5
endWord.length == beginWord.length
1 ≦ wordList.length ≦ 1000
wordList[i].length == beginWord.length
beginWord 、 endWord 和 wordList[i] 由小寫英文字母組成。
beginWord != endWord
wordList 中的字詞皆相異。
範例測資:
範例 1:
輸入: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
輸出: [["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
解釋: 存在 2 個最短的變換序列如下:
"hit" → "hot" → "dot" → "dog" → "cog"
"hit" → "hot" → "lot" → "log" → "cog"
範例 2:
輸入: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
輸出: []
解釋: 結尾字詞 "cog" 不在 wordList 中,因此沒有任何合法的變換序列。
解題思維:
先從 beginWord 廣度優先搜尋(Breadth First Search,BFS)一次,看「每多一次變換」可以產出哪些新的字詞且有在 wordList 中(先前有遇過的則忽略),然後把這些變換關係存到雜湊表裡以供查詢。
接著再從 beginWord 一路進行深度優先搜尋(Depth First Search,DFS)看有多少個變換可以走到 endWord。而因為 BFS 的特性,使得此時如果可以從 beginWord 變到 endWord,則該變換序列會是最短的。
因此 DFS 過程中找到的變換序列們即為所求。而以上所有「列表」類的物件建議都使用雜湊表來儲存,以免查詢的時候太耗時。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。