Leetcode: 126. Word Ladder II
Problem Statement
from typing import List
class Solution:
def findLadders(
self, beginWord: str, endWord: str, wordList: List[str]
) -> List[List[str]]:
def is_adj(u, v):
return sum(1 for a, b in zip(u, v) if a != b) == 1
A = {w: [] for w in wordList + [beginWord, endWord]}
for u in wordList + [endWord]:
for v in wordList + [beginWord]:
if u != v and is_adj(u, v):
A[u].append(v)
dist = {w: None for w in A}
dist[endWord] = 0
queue = [endWord]
for u in queue:
for v in A[u]:
if dist[v] is None:
dist[v] = dist[u] + 1
queue.append(v)
ans = []
for u in wordList:
if u != beginWord and u not in A[beginWord] and is_adj(u, beginWord):
A[beginWord].append(u)
@cache
def dfs(u):
if dist[u] == 0:
return [[u]]
ans = []
for v in A[u]:
if dist[v] == dist[u] - 1:
ans.extend([u] + p for p in dfs(v))
return ans
return dfs(beginWord)