Loading

【力扣】127. 单词接龙

给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。
说明:

如果不存在这样的转换序列,返回 0。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:

输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出: 5

解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
返回它的长度 5。
示例 2:

输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

输出: 0

解释: endWord "cog" 不在字典中,所以无法进行转换。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-ladder
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        //1.先将 wordList 放到哈希表里,便于判断某个单词是否在 wordList 里
        if(!wordList.contains(endWord)){
            return 0;
        }
        Set<String> wordSet = new HashSet<String>();
        wordSet.addAll(wordList);
        //wordSet.remove(beginWord);
        // 第 2 步:图的广度优先遍历,必须使用队列和表示是否访问过的 visited 哈希表
        Deque<String> queue = new ArrayDeque<String>();
        queue.offer(beginWord);
        Set<String> visitedSet = new HashSet<>();
        visitedSet.add(beginWord);
        
        // 第 3 步:开始广度优先遍历,包含起点,因此初始化的时候步数为 1
        int step = 1;
        
        while(!queue.isEmpty()){
            //得到当前队列的个数
            int currentSize = queue.size();
            for(int i = 0; i < currentSize;i++){
                // 依次遍历当前队列中的单词
                String currentWord = queue.poll();

                // 如果 currentWord 能够修改 1 个字符与 endWord 相同,则返回 step + 1
                char[] charArray = currentWord.toCharArray();

                for(int j = 0; j < currentWord.length(); j++){
                    //将当前字母中的任意一个字母更改
                    char tempChar = charArray[j];

                    //从 a 到 z
                    for(char k = 'a' ; k <= 'z'; k++){
                        if(k == tempChar){ //相等无须处理
                            continue;
                        }
                        //替换其中的某个字符
                        charArray[j] = k;
                        String mayBeNextWord = String.valueOf(charArray);

                        //说明当前的转换序列是ok的
                        if(wordSet.contains(mayBeNextWord)){
                            //若是直接就是最后一位
                            if(endWord.equals(mayBeNextWord)){
                                return step+1;
                            }
                            if(!visitedSet.contains(mayBeNextWord)){
                                //加入到队列中,因为这就是下一个哇
                                queue.add(mayBeNextWord);
                                //当然,下次就不能还是这个了
                                visitedSet.add(mayBeNextWord);
                            }
                        }
                    }
                    //恢复char数组,以便替换下一个索引的字符
                    charArray[j] = tempChar;
                }
            }
            step++;
        }
        return 0;

    }
}

 

 

 

参考:https://leetcode-cn.com/problems/word-ladder/solution/yan-du-you-xian-bian-li-shuang-xiang-yan-du-you-2/

posted @ 2020-11-05 23:53  冯廷鑫  阅读(126)  评论(0)    收藏  举报