您的位置:首页 > 其它

LeetCode Word Ladder II

2015-06-14 01:18 323 查看
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:

Only one letter can be changed at a time

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 {
private:
vector<vector<string>> res;
public:
vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
res.clear();

unordered_map<string, vector<string> > paths;

queue<string> que;

que.push(start);
dict.insert(end);

vector<string> del;
del.push_back(start);

while (!que.empty()) {
int size = que.size();

for (string& s : del) {
dict.erase(s);
}

del.clear();

for (int i=0; i<size; i++) {

string str = que.front();
string orig = str;
que.pop();

if (str == end) {
continue;
}
for (char& ch : str) {
for (char c = 'a'; c <= 'z'; c++) {
if (ch == c) {
continue;
}
char t = ch;
ch = c;

if (dict.count(str) > 0) {
del.push_back(str);
que.push(str);

if (paths.count(str) == 0) {
paths.insert(make_pair(str, vector<string>()));
}
paths[str].push_back(orig);
}
ch = t;
}
}
}
}
vector<string> path;
path.push_back(end);
build_path(paths, path, end);
return res;
}

void build_path(unordered_map<string, vector<string> > paths, vector<string>& path, string prev) {
if (paths.count(prev) == 0) {
if (path.size() < 2) return;
reverse(path.begin(), path.end());
res.push_back(path);
return;
}

vector<string>& strs = paths[prev];
for (string& s : strs) {
path.push_back(s);
build_path(paths, path, s);
path.pop_back();
}
}
};


TLE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: