Word Ladder

Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["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,改变某个位置的字母然后再查找,同时用2个queue分别记录步数和当前单词,每次的pop和push都同步。

    int ladderLength(string start, string end, unordered_set<string> &dict) {

        if (start==end) {
            return 1;
        }

        queue<string> nodes;//使用queue容器
        queue<int> depth;

        nodes.push(start);//start入队列
        depth.push(1);//1入队

        findItem(start, dict);//查看是否存在于字典中

        while (nodes.size()>0) {//遍历每一个单词

            string cur=nodes.front();//访问队首元素
            nodes.pop();//队列的第一个元素出队列

            int dep=depth.front();//步数初始为1
            depth.pop();

            for (int i=0; i<cur.size(); i++) {//改变单词的字母
                for (int j=0; j<26; j++) {//26个英文字母
                    if (cur[i]!='a'+j) {
                        string temp=cur;
                        temp[i]='a'+j;
                        if (temp==end) {
                            return dep+1;//可以转换为end,需要dep+1步
                        }
                        if (findItem(temp, dict)) {
                            nodes.push(temp);
                            depth.push(dep+1);
                        }
                    }
                }
            }
        }


        return 0;
    }

    bool findItem(string ts,unordered_set<string> &dict){
        unordered_set<string>::const_iterator ci=dict.find(ts);
        if (ci!=dict.end()) {
            dict.erase(ci);
            return true;
        }else{
            return false;
        }
        return true;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值