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

  

 

posted @ 2014-10-04 14:19  zombies  阅读(260)  评论(0编辑  收藏  举报