zoukankan      html  css  js  c++  java
  • 【力扣】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/

    一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    视频监控,硬盘录像机安装
    路由器、集线器和三层交换机有何不同
    九选六?九选三?
    Access数据转换为XML格式
    硬盘录像显示器显示画面有抖动感
    硬盘录像机开机监视一段时间后,显示器出现屏幕保护或者黑屏
    庆祝还活着
    天津之旅
    武汉之旅
    从今天起~~~
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/13934707.html
Copyright © 2011-2022 走看看