from collections import defaultdict
class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
if endWord not in wordList: return 0
all_combo_dict = defaultdict(list)
for word in wordList:
for i in range(len(endWord)):
all_combo_dict[word[:i] + "?" + word[i+1:]].append(word)
queue = collections.deque([(beginWord, 1)])
visited = {beginWord:True}
while queue:
cur_word, level = queue.popleft()
for i in range(len(cur_word)):
inter_status = cur_word[:i] + "?" + cur_word[i+1:]
for word in all_combo_dict[inter_status]:
if word == endWord:
return level + 1
if word not in visited:
visited[word] = True
queue.append((word, level + 1))
all_combo_dict[inter_status] = []
return 0