LintCode_单词接龙

来源:互联网 发布:js log 编辑:程序博客网 时间:2024/05/22 13:10

给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列

比如:

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

 注意事项

  • 如果没有转换序列则返回0。
  • 所有单词具有相同的长度。
  • 所有单词都只包含小写字母。

样例

给出数据如下:

start = "hit"

end = "cog"

dict = ["hot","dot","dog","lot","log"]

一个最短的变换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog"

返回它的长度 5

思路:用宽度优先搜索即可完成,需要引入一个辅助队列,并引入一个structt结构体以方便储存途径的长度


struct mid_string{    string data;     int length;  // 记录途径的长度};class Solution{public:    /**      * @param start, a string      * @param end, a string      * @param dict, a set of string      * @return an integer      */    queue<mid_string> temp;    int find_length(string start,string end,unordered_set<string> &dict)    {        mid_string r,s;        r.data=start;        r.length=1;        temp.push(r); //把start单词加入队列中        dict.erase(start); //删除字典中的start单词(如果有)        while(!temp.empty())        {            s=temp.front();            temp.pop();            for(int i=0; i<s.data.size(); i++)            {                string s_copy=s.data;                for(char j='a'; j<='z'; j++)                {                    if(j==s.data[i]) continue;                    s_copy[i]=j;                    if(s_copy==end) return s.length+1;                    if(dict.find(s_copy)!=dict.end())  //如果能找得到                    {                        r.data=s_copy;                        r.length=s.length+1;                        temp.push(r);                        dict.erase(s_copy);                    }                }            }        }        return 0;    }    int ladderLength(string start, string end, unordered_set<string> &dict)    {        if(start.length()==0||end.length()==0) return 0;        if(start==end) return 1;        return find_length(start,end,dict);    }};


原创粉丝点击