LeetCode-Word Ladder-单词梯-BFS构图
https://oj.leetcode.com/problems/word-ladder/
Word Ladder II的简化版。这个跟II比起来只需要搜索出来最短路径即可。
我使用的方法还是BFS,用按层次搜索的层次来当做每个结点的距离。从start出发,不断修改单词进行扩展结点。当搜索到end时就停止(本题中在搜索到和出队时停止都没有问题)。然后就是注意不要搜索重复结点,并考虑单词表中有start和end的情况就行了。
typedef unordered_set<string>::iterator sciter;
const int INF=9999;
class Solution {
public:
int n,m;
unordered_map <string,int> cm;
vector <string> el;
vector <int> level;
int ladderLength(string start, string end, unordered_set<string> &dict) {
dict.erase(start);
dict.erase(end);
for (sciter it=dict.begin();it!=dict.end();it++){
el.push_back(*it);
cm[*it]=el.size()-1;
}
el.push_back(start);
cm[start]=el.size()-1;
el.push_back(end);
cm[end]=el.size()-1;
dict.insert(end);
n=el.size();
m=start.length();
level.resize(n,INF);
list <int> que;
que.push_back(cm[start]);
level[cm[start]]=1;
while(!que.empty()){ //the bfs
int u=que.front();
que.pop_front();
if (u==cm[end]){break;}
if (level[u]>=level[cm[end]]){continue;}
for (int i=0;i<m;i++){
for (int j=0;j<26;j++){
char ch='a'+j;
if (ch==el[u][i]){continue;}
string ns=el[u];
ns[i]=ch;
if (dict.find(ns)!=dict.end()){
if (level[cm[ns]]<INF){
continue;
}
level[cm[ns]]=level[u]+1;
que.push_back(cm[ns]);
}
}
}
}
if (level[cm[end]]==INF){return 0;}
return level[cm[end]];
}
};
浙公网安备 33010602011771号