127. 单词接龙

1. 题目

字典 wordList 中从单词 beginWordendWord转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk

  • 每一对相邻的单词只差一个字母。
  • 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
  • sk == endWord

给你两个单词 beginWordendWord 和一个字典 wordList ,返回 beginWordendWord最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 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
  • beginWordendWordwordList[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²)

image-20231130183802206