题目
解析:
这道题目本质上是个无向图的题目,wordlist中每个单词作为一个节点,每个节点之间如果只差一个字母则有边相连。求开始节点到结束节点的最短距离。方法好像挺多的,最快的是双向BFS,但是我这边只提供最简单易懂的单向BFS,双向的方法后面再说吧。
最简单的思路包含三个部分:
- 第一是一个字典,字典的key为通用的word pattern,比如’d*g’,而value是一个list,包含所有符合这个pattern的word,比如[dog,dig,dug]。在python里直接用collections.defaultdict(list)就可以完成
- 第二个是visited,用set表示,用来包含所有已经访问过的word防止访问过程中成环
- 第三个是BFS所需要用到的队列,队列里的元素是pair,包含这个word本身和到达这个word所需要的步数
用python写就非常简洁,代码如下:
class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
adj = collections.defaultdict(list)
for word in wordList:
for i in range(len(word)):
adj[word[:i]+'*'+word[i+1:]].append(word)
visited = set()
q = collections.deque()
q.append((beginWord,1))
while q:
word,k = q.popleft()
if word == endWord:
return k
if word not in visited:
visited.add(word)
for i in range(len(word)):
neighbors = word[:i]+'*'+word[i+1:]
for neigh in adj[neighbors]:
if neigh not in visited:
q.append((neigh,k+1))
return