题解转载自代码随想录
本题只需要求出最短路径的长度就可以了,不用找出路径。
所以这道题要解决两个问题:
1.图中的线是如何连在一起的
首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个,所以判断点与点之间的关系,要自己判断是不是差一个字符,如果差一个字符,那就是有链接
2.起点和终点的最短路径长度
然后就是求起点和终点的最短路径长度,这里无向图求最短路,bfs最为合适,广搜只要搜到了终点,那么一定是最短的路径。因为广搜就是以起点中心向四周扩散的搜索
注意:
1.本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环!
2.本题给出集合是数组型的,可以转成set结构,查找更快一些
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
//转换为hashset 加快查找单词速度
HashSet<String> wordSet = new HashSet<>(wordList);
//特殊情况判断
if (wordSet.size() == 0 || !wordSet.contains(endWord)) return 0;
Queue<String> queue = new LinkedList<>();
//初始化bfs队列
queue.offer(beginWord);
//记录单词对应路径长度
Map<String, Integer> map = new HashMap<>();
map.put(beginWord, 1);
while(!queue.isEmpty()){
String word = queue.poll(); //取出队头单词
int path = map.get(word); //获取到该单词的路径长度
//遍历单词中的每个字母并尝试替换
for(int i=0;i<word.length();i++){
//将单词转换为char array,方便替换
char[] chars = word.toCharArray();
//从'a' 到 'z' 遍历替换word(i)
for (char k = 'a'; k <= 'z'; k++) {
chars[i]=k;
String newWord = String.valueOf(chars); //得到新的字符串
//如果新的字符串值与endWord一致,返回当前长度+1
if(newWord.equals(endWord)) return path+1;
//如果新的字符串值没有被访问过,且在wordList中,说明word到newWord存在路径
if(!map.containsKey(newWord)&&wordSet.contains(newWord)){
map.put(newWord,path+1);
queue.offer(newWord);
}
}
}
}
//未找到路径
return 0;
}
}
873

被折叠的 条评论
为什么被折叠?



