您的位置:首页 > 其它

LintCode_单词接龙

2017-08-21 00:01 393 查看
给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列
比如:


每次只能改变一个字母。

变换过程中的中间单词必须在字典中出现。


 注意事项



如果没有转换序列则返回0。

所有单词具有相同的长度。

所有单词都只包含小写字母。

您在真实的面试中是否遇到过这个题? 

Yes

样例

给出数据如下:
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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: