您的位置:首页 > 其它

lintcode,单词接龙

2016-12-22 14:23 218 查看
给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列

比如:

每次只能改变一个字母。

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

注意事项

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

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

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

样例

给出数据如下:

start = “hit”

end = “cog”

dict = [“hot”,”dot”,”dog”,”lot”,”log”]

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

返回它的长度 5

一刷没ac

解题思路:把每个string看作节点,如果string之间距离为1说明有连线,相当于找到最短的连线长度。这里的解法是宽搜,用队列存节点,用一个map存访问过的节点,从队列取一个元素,把这个元素的所有距离为1的string找出来加入到队列里(前提是这个str在dict中并且没被访问过企鹅不同于原始的这个元素)。

public class Solution {
/**
* @param start, a string
* @param end, a string
* @param dict, a set of string
* @return an integer
*/
public int ladderLength(String start, String end, Set<String> dict) {
if(start.equals(end)) return 1;
Set<String> visited = new HashSet<String>();
LinkedList<String> queue = new LinkedList<String>();
queue.offer(start);
dict.add(end);
visited.add(start);
int res = 1;
while(!queue.isEmpty()){
int size = queue.size();
for(int sz = 0; sz < size; sz++){
String str = queue.poll();
for(int i = 0; i < str.length(); i++){
char[] strarr = str.toCharArray();
for(char j = 'a'; j <= 'z'; j++){
strarr[i] = j;
String tmp = new String(strarr);
if(tmp.equals(end)) return res+1;
if(!tmp.equals(str) && !visited.contains(tmp) && dict.contains(tmp)){
visited.add(tmp);
queue.add(tmp);
}
}
}
}
res++;

}

return 0;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lintcode