18.10 Given two words of equal length that are in a dictionary, write a method to transform one word into another word by changing only one letter at a time. The new word you get in each step must be in the dictionary.
這道題讓我們將一個單詞轉換成另一個單詞,每次只能改變一個字母,讓我們輸出中間轉換過程的單詞。LeetCode上有類似的題目One Edit Distance和Edit Distance。我們的方法是寫一個get_one_edit_words()函式,來返回某一個單詞變動一個字母的所有可能情況,然後我們在transform函式中先將開始的單詞存入一個佇列queue中,還需要一個set來記錄所有訪問過的單詞,還需要雜湊表來建立當前單詞和變換一步後的單詞之間的對映,然後開始類似BFS的遍歷,對於每一個單詞,遍歷get_one_edit_words()函式返回的結果,如果變換後的單詞就是目標單詞,則我們完成了變換,根據backtrack將整個路徑上的單詞存入結果中,如果變換單詞不是目標單詞,但是在字典中,如果沒有在字典中,則我們將其排入queue,並加入visited,和建立雜湊表的對映,繼續遍歷,參見程式碼如下:
set<string> get_one_edit_words(string word) { set<string> res; for (int i = 0; i < word.size(); ++i) { string t = word; for (char c = 'a'; c <= 'z'; ++c) { if (c != word[i]) { t[i] = c; res.insert(t); } } } return res; } vector<string> transform(string start, string end, set<string> dict) { queue<string> q; set<string> visited; unordered_map<string, string> backtrack; q.push(start); visited.insert(start); while (!q.empty()) { string w = q.front(); q.pop(); for (string v : get_one_edit_words(w)) { if (v == end) { vector<string> res{v}; while (!w.empty()) { res.insert(res.begin(), w); w = backtrack[w]; } return res; } if (dict.count(v)) { if (!visited.count(v)) { q.push(v); visited.insert(v); backtrack[v] = w; } } } } return {}; }
類似題目: