avatar
A*g
1
Leetcode OJ里的word ladder, 过了小test,大test第一个就超时了,不解!
用的是BFS算法,请大牛们看看有什么问题,谢谢!
class Solution {
public:
typedef unordered_map > Graph;
bool has_edge(string a, string b) {
if (a.size() != b.size()) {
return false;
}
int diff = 0;
for (int i=0; iif (a[i] != b[i])
diff++;
}
return diff==1;
}
void build_graph(string &start, string &end, unordered_set &dict
, Graph &G) {
unordered_set neighbors;
G[start+"s"] = neighbors;
G[end+"e"] = neighbors;
for (auto itr=dict.begin(); itr!=dict.end(); ++itr) {
G[*itr+"m"] = neighbors;
}

for (auto itr=G.begin(); itr!=G.end(); ++itr) {
for (auto itr2=G.begin(); itr2!=G.end(); ++itr2) {
if( has_edge( itr->first.substr(0,itr->first.size()-1),
itr2->first.substr(0,itr2->first.size()-1)) )
itr->second.insert(itr2->first);
}
}
}

void init_distance( unordered_map &distance, Graph &G) {
for (auto itr=G.begin(); itr!=G.end(); ++itr) {
distance[itr->first] = INT_MAX;
}
}

void BFS(string start, string end, Graph &G, unordered_map &
distance) {
queue q;
q.push(start);
distance[start] = 0;
while(q.size() != 0) {
string s = q.front();
q.pop();
for (auto itr=G[s].begin(); itr!=G[s].end(); ++itr) {
if (distance[*itr] == INT_MAX) {
distance[*itr] = distance[s]+1;
q.push(*itr);
}
}
}
}
int ladderLength(string start, string end, unordered_set &dict) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
Graph G;
build_graph(start, end, dict, G);
unordered_map distance;
init_distance( distance, G);
BFS(start+"s", end+"e", G, distance);

if (distance[end+"e"] == INT_MAX) //can't reach, word ladder has
length 0
return 0;

int ret = distance[end+"e"]+1;
return ret;

}
};
avatar
p*g
2
avatar
A*o
3
In your BFS, add a 'visited' unordered_map to bookkeep nodes you have
already visited in yout BFS. Your current BFS has no bound.
avatar
l*o
4
数字越大,越长
avatar
i*e
5
首先,你代码太长了吧,就算OJ 过了也不代表你的代码够简洁。
这题不需要build 完整的graph 再做bfs 的。如果字典很大你这个build graph 很耗时
间的。
你看能不能再简化一点。

【在 A******g 的大作中提到】
: Leetcode OJ里的word ladder, 过了小test,大test第一个就超时了,不解!
: 用的是BFS算法,请大牛们看看有什么问题,谢谢!
: class Solution {
: public:
: typedef unordered_map > Graph;
: bool has_edge(string a, string b) {
: if (a.size() != b.size()) {
: return false;
: }
: int diff = 0;

avatar
r*e
6
哈哈

【在 p*********g 的大作中提到】

avatar
A*g
7
distance (a map string->int) is used keep track of "visited", if a node's
distance to the start point is not INT_MAX, that means it is "visited".

【在 A***o 的大作中提到】
: In your BFS, add a 'visited' unordered_map to bookkeep nodes you have
: already visited in yout BFS. Your current BFS has no bound.

avatar
A*g
8
求简洁算法... 想不到啊

【在 i**********e 的大作中提到】
: 首先,你代码太长了吧,就算OJ 过了也不代表你的代码够简洁。
: 这题不需要build 完整的graph 再做bfs 的。如果字典很大你这个build graph 很耗时
: 间的。
: 你看能不能再简化一点。

avatar
p*2
11

scala leetcode也不支持呀。

【在 A******g 的大作中提到】
: 谢谢二爷! 幸好不是scala的...
avatar
s*w
13
严重赞成 BFS 不需要完整的 graph construction
我刚写 BFS 的时候也是先上个完整的 adjacency list, 后来发现很多时候都是 用到
adj[i] 的时候再现找;大部分情况下 BFS 还没 traverse 完就找到退出了,会快很多

【在 i**********e 的大作中提到】
: 首先,你代码太长了吧,就算OJ 过了也不代表你的代码够简洁。
: 这题不需要build 完整的graph 再做bfs 的。如果字典很大你这个build graph 很耗时
: 间的。
: 你看能不能再简化一点。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。