LeetCode -- Word Ladder II

来源:互联网 发布:现代商友软件 编辑:程序博客网 时间:2024/05/16 01:21

在字典中搜索最短单词转换路径,

该题的关键有两点:

1)BFS遍历时需要逐层替换(不同层的单词不同,但同层可重复),这里使用2层交替;

2)使用hashmap记录当前单词与父节点单词的反向链接,在到达含有end单词的层后,反向遍历输出所有转换路径。

Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

Return

  [    ["hit","hot","dot","dog","cog"],    ["hit","hot","lot","log","cog"]  ]

Note:

  • All words have the same length.
  • All words contain only lowercase alphabetic characters.
class Solution {    void outputPath(vector<vector<string>> &res, vector<string> &path,        unordered_map<string, vector<string> > &reverseLink, string end){        if(reverseLink[end].size() == 0){            vector<string> tmp = path;            reverse(tmp.begin(), tmp.end());            res.push_back(tmp);        } else {            vector<string>::iterator it;            for(it = reverseLink[end].begin(); it != reverseLink[end].end(); it++){                path.push_back(*it);                outputPath(res, path, reverseLink, *it);                path.pop_back();            }        }    }public:    vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {        unordered_map<string, vector<string> > reverseLink;        if(dict.find(end) == dict.end()) dict.insert(end);        unordered_set<string> layer[2];        layer[0].insert(start);        int cur = 0, next = 1, len = start.length();        while(!layer[cur].empty()){            if(reverseLink.find(end) != reverseLink.end()) break;            unordered_set<string>::iterator it;            for(it = layer[cur].begin(); it != layer[cur].end(); it++){                dict.erase(*it);            }            layer[next].clear();            for(it = layer[cur].begin(); it != layer[cur].end(); it++){                string p = *it;                for(int j = 0; j < len; j++){                    char c = p[j];                    for(char k = 'a'; k <= 'z'; k++){                        if(c == k) continue;                        p[j] = k;                        if(dict.find(p) != dict.end()){                            layer[next].insert(p);                            reverseLink[p].push_back(*it);                        }                    }                    p[j] = c;                }            }            cur = !cur; next = !next;        }        vector<vector<string>> res;        if(reverseLink.find(end) == reverseLink.end()) return res;        vector<string> path; path.push_back(end);        outputPath(res, path, reverseLink, end);        return res;    }};


0 0
原创粉丝点击