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);
}
};
比如:
变换过程中的中间单词必须在字典中出现。
注意事项
所有单词具有相同的长度。
所有单词都只包含小写字母。
您在真实的面试中是否遇到过这个题?
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);
}
};
相关文章推荐
- LintCode 120-单词接龙 广度优先搜索
- LintCode-单词接龙II
- lintcode,单词接龙
- 单词接龙-LintCode
- lintcode-120-单词接龙
- LINTCODE——单词接龙
- lintcode 单词接龙II
- ***[Lintcode]Word Ladder 单词接龙
- 单词接龙 II-LintCode
- POJ 1386 单词接龙问题
- 百度2017年暑期实习生笔试题——单词接龙
- LintCode 循环单词
- 【DFS】CODE[VS] 1018&&NOIP2000提高组T3 单词接龙 (日常刷题???)
- P1019 单词接龙题解
- 图论欧拉路径问题(单词接龙)
- [LintCode] 最后一个单词的长度
- 洛谷 P1019 单词接龙
- 蓝桥杯 算法训练 单词接龙
- noip2000单词接龙(搜素)
- 单词排序 --- lintcode 819