Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
Only one letter can be changed at a time Each intermediate word must exist in the dictionary For example,
Given:
start ="hit"
end ="cog"
dict =["hot","dot","dog","lot","log"]
As one shortest transformation is"hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length5.
Note:
Return 0 if there is no such transformation sequence. All words have the same length. All words contain only lowercase alphabetic characters.
解题思路:
- 该题的考点在于广度优先搜索
- 设置多个 Hashset 来处理中间值
- beginSet 存放开始状态值,endSet 存放结束值,visited 来存放已经被访问过的字符串
- 依次取出 beginSet 里的字符串,替换其中的字母。将替换后的字符串与结果集进行比较,若存在于结果集,返回 res,如果不存在于结果集,看看它是否在参数 dict 中,若在,放入 visited 中,同时存入 beginSet 中
代码如下:
public int ladderLength(String start, String end, HashSet<String> dict) {
// 初始化数据结构
HashSet<String> beginSet = new HashSet<>();
HashSet<String> endSet = new HashSet<>();
HashSet<String> visited = new HashSet<>();
beginSet.add(start);
endSet.add(end);
visited.add(start);
int res = 1;
// 循环处理 beginSet
while(!beginSet.isEmpty() && !endSet.isEmpty() ){
HashSet<String> temp = new HashSet<>();
for(String str : beginSet){
char [] chs = str.toCharArray();
for(int i = 0; i < chs.length; i++){
char old = chs[i];
for(char c = 'a'; c <= 'z'; c++){
chs[i] = c;
String cur = String.valueOf(chs);
if(endSet.contains(cur)){
return res + 1;
}
if(!visited.contains(cur) && dict.contains(cur)){
temp.add(cur);
visited.add(cur);
}
}
chs[i] = old;
}
}
beginSet = temp;
res++;
}
return 0;
}