-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathwordladder.py
More file actions
39 lines (31 loc) · 1.03 KB
/
wordladder.py
File metadata and controls
39 lines (31 loc) · 1.03 KB
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
from collections import deque, defaultdict
def word_ladder(beginWord, endWord, wordList):
wordSet = set(wordList)
if endWord not in wordSet:
return 0
# Preprocess: create patterns like h*t, ho*
neighbors = defaultdict(list)
for word in wordSet:
for i in range(len(word)):
pattern = word[:i] + "*" + word[i+1:]
neighbors[pattern].append(word)
# BFS
queue = deque([(beginWord, 1)])
visited = set([beginWord])
while queue:
word, steps = queue.popleft()
if word == endWord:
return steps
for i in range(len(word)):
pattern = word[:i] + "*" + word[i+1:]
for nei in neighbors.get(pattern, []):
if nei not in visited:
visited.add(nei)
queue.append((nei, steps + 1))
return 0
# 🔹 Example Run
if __name__ == "__main__":
begin = "hit"
end = "cog"
words = ["hot","dot","dog","lot","log","cog"]
print(word_ladder(begin, end, words)) # Output: 5