LeetCode | Word Ladder

100 篇文章 0 订阅
2 篇文章 0 订阅

参考文章:http://blog.csdn.net/yutianzuijin/article/details/12887747

Given two words (beginWord and endWord), and a dictionary’s word list, find the length of shortest transformation sequence from beginWord to endWord, such that:

Only one letter can be changed at a time
Each intermediate word must exist in the word list
For example,

Given:
beginWord = “hit”
endWord = “cog”
wordList = [“hot”,”dot”,”dog”,”lot”,”log”]
As one shortest transformation is “hit” -> “hot” -> “dot” -> “dog” -> “cog”,
return its length 5.

Note:
Return 0 if there is no such transformation sequence.
All words have the same length.
All words contain only lowercase alphabetic characters.

这道题写的真是一把辛酸泪…
首先看起来就是BFS,那就暴搜吧。。
使用队列并使用int i=0,n=Q.size(),i

class Solution {
public:
    int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) {
        unordered_set<string> visit;
        // if(!canEnter(beginWord,wordList)) return 0;

        queue<string> Q;
        Q.push(beginWord);
        visit.insert(beginWord);

        int step=-1;
        while(!Q.empty()){
            step++;
            //类似于层次遍历,求所有节点
            for(int i=0,n=Q.size();i<n;i++){
                string s=Q.front();
                Q.pop();

                //退出循环
                if(s==endWord){
                    return step+1;
                }

                if(validNext(s,endWord)){
                    return step+2;
                }

                //将当前单词的每一位进行替换a-z,判断是否出现在set中
                for(int j=0;j<s.size();j++){
                    string tp=s;
                    for(char c='a';c<='z';c++){
                        if(c==tp[j]) continue;
                        swap(c,tp[j]);
                        //如果这个可以在表中找到,并且没有使用过
                        if(wordList.find(tp)!=wordList.end() && visit.find(tp)==visit.end()){
                            Q.push(tp);
                            visit.insert(tp);
                        }
                        swap(c,tp[j]);
                    }
                }

                //这种遍历set中所有元素的方法,存在很多
                // for(auto iter=wordList.begin();iter!=wordList.end();iter++){
                //     string s=(string) *iter;
                //     //如果这个s没有被使用过
                //     if(visit.find(s)==visit.end()){
                //         Q.push(s);
                //         //标记上
                //         visit.insert(s);
                //     }
                // }
            }
        }
        return 0;
    }

    //判断一个元素能否进入列表
    bool canEnter(string s,unordered_set<string>& wordList){
        //在set里面找
        for(auto iter=wordList.begin();iter!=wordList.end();iter++){
            string item=(string) *iter;
            if(validNext(s,item)) return true;
        }
        return false;
    }

    //判断两个字符串只有一个位不相同
    bool validNext(string &s,string &target){
        int diff=0;
        for(int i=0;i<s.size();i++){
            if(s[i]!=target[i]){
                diff++;
                if(diff>=2) return false;
            }
        }
        if(diff==1) return true;
        return false;
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值