Leetcode: 425. Word Squares
Problem Statement
from typing import List
class Solution:
def wordSquares(self, words: List[str]) -> List[List[str]]:
N = len(words)
M = len(words[0])
if M == 1:
return list(set(words))
pref = {}
for w in words:
for i in range(M):
p = w[0 : i + 1]
pref.setdefault(p, set())
pref[p].add(w)
ans = []
def bt(i, cur):
if i == M:
ans.append(cur[:])
return
for w in pref.get("".join(v[i] for v in cur), []):
cur.append(w)
bt(i + 1, cur)
cur.pop()
for w in words:
bt(1, [w])
return ans
assert Solution().wordSquares(["area", "lead", "wall", "lady", "ball"]) == [
["ball", "area", "lead", "lady"],
["wall", "area", "lead", "lady"],
]
assert Solution().wordSquares(["abat", "baba", "atan", "atal"]) == [
["baba", "abat", "baba", "atal"],
["baba", "abat", "baba", "atan"],
]