Leetcode 127. 单词接龙 bfs

给定两个单词(beginWord endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

  1. 每次转换只能改变一个字母。
  2. 转换过程中的中间单词必须是字典中的单词。

说明:

  • 如果不存在这样的转换序列,返回 0。
  • 所有单词具有相同的长度。
  • 所有单词只由小写字母组成。
  • 字典中不存在重复的单词。
  • 你可以假设 beginWordendWord 是非空的,且二者不相同。

示例 1:

输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出: 5

解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
     返回它的长度 5。

示例 2:

输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

输出: 0

解释: endWord "cog" 不在字典中,所以无法进行转换。

 想了个最简单的方法,想着可能超时,结果没超时。。。但是复杂度很高。。。

原因出现在字符串查找是否入队上和vector选种元素的删除上。

附上第一次写的代码:
C++:
 

class Solution {
public:
    struct node
    {
        int num;
        string s;
    };
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
         queue<node>q;
         int Size=wordList.size();
         int vis[Size+1];
         memset (vis,0,sizeof(vis));
         node now,next;
         now.num=1; now.s=beginWord;
         q.push(now);
         while (!q.empty())
         {
             now=q.front();
             q.pop();
             if(now.s==endWord)
                 return now.num;
             for (int i=0;i<Size;i++)
                 if(Isone(vis,now.s,wordList[i],i))
                 {
                     next.num=now.num+1;
                     next.s=wordList[i];
                     vis[i]=1;
                     q.push(next);
                 }
         }
        return 0;
    }
    bool Isone (int *vis,string a,string b,int i)
    {
        if(vis[i]==1)
            return false;
        int len=a.size(),diff=0;
        for (int i=0;i<len;i++)
        {
            if(a[i]!=b[i])
                diff++;
            if(diff==2)
                return false;
        }
        if(diff==1)
           return true;
        else 
           return false;
    }
    
};

看了别人的代码, 恍然大悟。。 。

然后模仿大佬的代码写了一个, 发现果然快了好多。 。

代码如下:

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        queue<string>q;
        map<string,int>m1; //储存vector中的字符串便于查找是否存在
        map<string,int>re; //储存结果
        int Size=wordList.size();
        for (int i=0;i<Size;i++)
            m1[wordList[i]]=1;
        re[beginWord]=1;
        q.push(beginWord);
        while ((!q.empty())&&m1.size())
        {
            string now=q.front();
            q.pop();
            int num=re[now];
            int llen=now.size();
            for (int i=0;i<llen;i++)
            {
                string temp=now;
                for (char c='a';c<='z';c++)
                {
                    if(temp[i]==c)
                        continue;
                    else 
                        temp[i]=c;
                    if(m1.find(temp)!=m1.end())
                    {
                      if(temp==endWord)
                        return num+1;
                      q.push(temp);
                      re[temp]=num+1;
                      m1.erase(temp);
                    }
                }
            }
        }
        return 0;
    }
};
扫描二维码关注公众号,回复: 3081168 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/82383616
今日推荐