Word Ladder 單詞接龍
阿新 • • 發佈:2018-12-12
給定兩個單詞(beginWord 和 endWord)和一個字典,找到從 beginWord 到 endWord 的最短轉換序列的長度。轉換需遵循如下規則:
- 每次轉換隻能改變一個字母。
- 轉換過程中的中間單詞必須是字典中的單詞。
說明:
- 如果不存在這樣的轉換序列,返回 0。
- 所有單詞具有相同的長度。
- 所有單詞只由小寫字母組成。
- 字典中不存在重複的單詞。
- 你可以假設 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:
輸入: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] 輸出:5 解釋: 一個最短轉換序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的長度 5。
示例 2:
輸入: beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log"] 輸出: 0 解釋: endWord "cog" 不在字典中,所以無法進行轉換。
思路:這道題是典型的DFS演算法,首先看下題目中給的示例
start = "hit"
end = "cog"
dict = ["hot", "dot", "dog", "lot", "log"]
因為每次只能改變一個字元,如果我們從”hit“開始,只能改變和hit只有一個字元不同的字串,比如 "hot"
。把這種思想抽象成圖,那麼“hot”是“hit”的鄰接點。
思路是從start開始,每次訪問它的鄰接點,然後訪問它的鄰接點的鄰接點... 這是典型的BFS解題模式。
為了簡化問題, 把end放入dict中,只要在BFS遍歷過程中發現了end,就直接返回結果. 我們維護一個int的變數 dist
,表示從開始節點到當前節點有過幾次transform,然後在每次BFS後dist++,同時為了避免重複訪問鄰接點,每次訪問一個word就從dict中刪除該word。
參考程式碼:
class Solution { public: void addNextWord(string &beginWord, unordered_set<string>& wordList, queue<string> &q) { wordList.erase(beginWord); for (int i = 0; i < (int)beginWord.length(); i++) { char letter = beginWord[i]; for (int j = 0; j < 26; j++) { beginWord[i] = 'a' + j; if (wordList.find(beginWord) != wordList.end()) { q.push(beginWord); wordList.erase(beginWord); } } beginWord[i] = letter; } } int ladderLength(string beginWord, string endWord, vector<string>& wordList) { unordered_set<string> w_list; for (auto s : wordList) w_list.insert(s); if (w_list.find(endWord) == w_list.end()) return 0; queue<string> q; w_list.insert(endWord); addNextWord(beginWord, w_list,q); int dist = 2; while (!q.empty()) { for (int tmp = q.size(); tmp > 0; tmp--) { auto top = q.front(); q.pop(); if (top == endWord) return dist; addNextWord(top, w_list, q); } dist++; } return 0; } };