您的位置:首页 > 其它

Leetcode Word Ladder 200ms

2014-11-11 12:20 281 查看
欢迎大家点评。
/* bidirection search
* time O(2d^{d/2}) space O(4n)
* 200ms 37/37
*/
class Solution {
public:
int ladderLength(string start, string end, unordered_set<string> &dict) {
if (start == end)
return 1;
queue<string> path;
queue<string> rpath;
path.push(start);
path.push("");
rpath.push(end);
rpath.push("");
int level = 1;
int rlevel = 1;
unordered_map<string, int> visited;
unordered_map<string, int> rvisited;
visited[start] = rvisited[end] = 1;
int dist;
while (path.front() != "" && rpath.front() != "") {
if (path.size() <= rpath.size()) {
dist = traverseLevel(path, visited, rvisited, level, end, dict);
if (dist != 0)    return dist;
level++;
}
else {
dist = traverseLevel(rpath, rvisited, visited, rlevel, start, dict);
if (dist != 0)    return dist;
rlevel++;
}
}
return 0;
}

int traverseLevel(queue<string> &path, unordered_map<string, int> &visited, unordered_map<string, int> &rvisited, int level, string &target, unordered_set<string> &dict) {
while (path.front() != "") {
string cur = path.front();
path.pop();
int i;
char c;
string tmp;
for (i = 0; i < cur.size(); i++) {
tmp = cur;
for(c = 'a'; c <= 'z'; c++) {
tmp[i] = c;
if (rvisited.find(tmp) != rvisited.end())
return rvisited[tmp] + level;
if (dict.find(tmp) != dict.end()) {
path.push(tmp);
visited[tmp] = level + 1;
dict.erase(tmp);
}
}
}
}
path.pop();
path.push("");
return 0;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: