[CareerCup] 18.10 Word Transform 單詞轉換

Grandyang發表於2016-05-10

 

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 DistanceEdit 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 {};
}

 

類似題目:

One Edit Distance

Edit Distance

 

CareerCup All in One 題目彙總

相關文章