Skip to content

Commit ac817d8

Browse files
committed
127. 单词接龙
1 parent b066691 commit ac817d8

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

graph/127_ladderLength.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import collections
2+
from typing import List
3+
4+
5+
class Solution:
6+
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
7+
def addWord(word: str):
8+
if word not in wordId:
9+
nonlocal nodeNum
10+
wordId[word] = nodeNum
11+
nodeNum += 1
12+
13+
def addEdge(word: str):
14+
addWord(word)
15+
id1 = wordId[word]
16+
chars = list(word)
17+
for i in range(len(chars)):
18+
tmp = chars[i]
19+
chars[i] = "*"
20+
newWord = "".join(chars)
21+
addWord(newWord)
22+
id2 = wordId[newWord]
23+
edge[id1].append(id2)
24+
edge[id2].append(id1)
25+
chars[i] = tmp
26+
27+
wordId = dict()
28+
edge = collections.defaultdict(list)
29+
nodeNum = 0
30+
31+
for word in wordList:
32+
addEdge(word)
33+
34+
addEdge(beginWord)
35+
if endWord not in wordId:
36+
return 0
37+
38+
dis = [float("inf")] * nodeNum
39+
beginId, endId = wordId[beginWord], wordId[endWord]
40+
dis[beginId] = 0
41+
42+
que = collections.deque([beginId])
43+
while que:
44+
x = que.popleft()
45+
if x == endId:
46+
return int(dis[endId] // 2 + 1)
47+
for it in edge[x]:
48+
if dis[it] == float("inf"):
49+
dis[it] = dis[x] + 1
50+
que.append(it)
51+
52+
return 0
53+
54+
55+
if __name__ == '__main__':
56+
solution = Solution()
57+
beginWord = "hit"
58+
endWord = "cog"
59+
wordList = ["hot", "dot", "dog", "lot", "log", "cog"]
60+
61+
print(solution.ladderLength(beginWord, endWord, wordList))

0 commit comments

Comments
 (0)