1. 题目
字典 wordList
中从单词 beginWord
和 endWord
的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk
:
- 每一对相邻的单词只差一个字母。
- 对于
1 <= i <= k
时,每个 si
都在 wordList
中。注意, beginWord
不需要在 wordList
中。
sk == endWord
给你两个单词 beginWord
和 endWord
和一个字典 wordList
,返回 从 beginWord
到 endWord
的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0
。
示例 1:
1 2 3
| 输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] 输出:5 解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。
|
示例 2:
1 2 3
| 输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"] 输出:0 解释:endWord "cog" 不在字典中,所以无法进行转换。
|
提示:
1 <= beginWord.length <= 10
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord
、endWord
和 wordList[i]
由小写英文字母组成
beginWord != endWord
wordList
中的所有字符串 互不相同
2. 思路
- 题目本身要求获取最短转换序列的长度,同时每一次转换仅仅能够转换1个字母,对应为单词表中的一个单词
- 可以将题目要求转化为有向图的最优路径求解,而面对有向图的最优路径求解,则可以联想到BFS-广度搜索算法
- 题目本身解法与433. 最小基因变化一致,其中需要可以优化的点在于将单词表转化为单词数组表,因为每个单词均是由小写字母组成,因此通过比对单词对应的字母数组表大小来判断,可以节省重复遍历比对单词表的时间复杂度
3. 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { public int ladderLength(String beginWord, String endWord, List<String> wordList) { var visit = new int[wordList.size()]; var deque = new ArrayDeque<String>(); var result = 1; deque.offer(beginWord);
while(!deque.isEmpty()) { var size = deque.size();
for (var i = 0; i < size; ++i) { var currentWord = deque.poll();
for (var j = 0; j < wordList.size(); ++j) { var nextWord = wordList.get(j);
if (visit[j] == 0 && canTransfrom(currentWord, nextWord)) { if (endWord.equals(nextWord)) { return result + 1; } visit[j] = 1; deque.offer(nextWord); } } }
result++; }
return 0; }
private boolean canTransfrom(String sourceWord, String targetWord) { var diffCount = 0; for (var i = 0; i < sourceWord.length(); ++i) { if (diffCount > 1) { return false; }
if (sourceWord.charAt(i) != targetWord.charAt(i)) { diffCount++; } }
return diffCount == 1; } }
|
4. 复杂度
- 时间复杂度:O(N * C²)
- 空间复杂度:O(N * C²)
Author:
zchengb
License:
Copyright (c) 2019-2024 zchengb