Leetcode 127-单词接龙

题解转载自代码随想录
本题只需要求出最短路径的长度就可以了,不用找出路径。

所以这道题要解决两个问题:
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值