给定两个单词(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/