word-ladder
题目描述
题目描述
给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度:
每一次转换只能改变一个单词
每一个中间词都必须存在单词字典当中
例如:
给定的初始单词start=“hit”,
目标单词end =“cog”。
单词字典dict =[“hot”,“dot”,“dog”,“lot”,“log”]
一个最短的转换序列为"hit" -> “hot” -> “dot” -> “dog” -> “cog”,
返回长度5
注意:
如果没有符合条件的转换序列,返回0。
题目中给出的所有单词的长度都是相同的
题目中给出的所有单词都仅包含小写字母
题目解析
题目要求找到初始单词到目标单词变化的最短路径长度,我们可以把这个整个路径看出一颗树,层次遍历的方式找到最短路径。如下
hit
hot
lot dot
log dog
cog cog
从根节点开始(初始单词)每次在字典中找与当前节点差一个单词的字符串作为下一个个叶子节点,直到找到与目标节点相差一个字符时的路径。
原题地址
import java.util.*;
public class Solution {
public int ladderLength(String start, String end, HashSet<String> dict) {
//计算树的深度,从开始字符,每次替换一个单词,到最后完全变成end字符串
//hit
// hot
// lot dot
// log dog
// cog cog
//使用一个队列存放与当前字符串相差一个的字符串
int depth = 1;//最短路径
boolean flag = false;//是否找到路径
Queue<String> queue = new LinkedList(); //存放当前路径的队列
queue.offer(start);
int cnt = queue.size();
while(!queue.isEmpty()){//当前队列不为空
for(String str: queue){
dict.remove(str);//如果字典里有当前字符,证明已经走过的路径,移除掉
}
String nowStr = queue.poll();//当前队列的第一个字符串,路径的下一步
cnt --;
if(nowStr.equals(end)){//当前字符等于目标字符
flag = true;
break;
}
for(String str : dict){
if(isNextPath(nowStr,str)){
queue.offer(str);//存放下一步的路径
}
}
if(cnt == 0){//与当前字符相差一个字符的全部找完
cnt = queue.size();
depth++;
}
}
if(flag){
return depth;
}else{
return 0;
}
}
//判断当前字符在字典是不是有一个只差一个字符的字符串
public boolean isNextPath(String nowStr,String nextStr){
int cnt = 0;
if( nowStr.length()!= nextStr.length()){
return false;
}
for(int i = 0; i < nowStr.length(); i++){
if(nowStr.charAt(i) != nextStr.charAt(i)){
cnt ++ ;
}
}
return cnt == 1? true:false;
}
}