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]]; } };