212. Word Search II

Question

CleanShot 2024-10-18 at 10.19.34@2x.png

Code

O(4LMN)
class TrieNode(object):
    def __init__(self):
        self.children = {}
        self.isWord = False

    def addWord(self, word):
        cur = self
        for c in word:
            if c not in cur.children:
                cur.children[c] = TrieNode()
            cur = cur.children[c]
        cur.isWord = True


class Solution(object):
    def findWords(self, board, words):
        root = TrieNode()

        for w in words:
            root.addWord(w)

        res, visited = set(), set()

        row, col = len(board), len(board[0])

        def dfs(r, c, node, word):
            if r < 0 or r >= row or c < 0 or c >= col or (r, c) in visited or board[r][c] not in node.children:
                return

            visited.add((r, c))
            node = node.children[board[r][c]]
            word += board[r][c]

            if node.isWord:
                res.add(word)
                node.isWord = False

            dfs(r + 1, c, node, word)
            dfs(r - 1, c, node, word)
            dfs(r, c + 1, node, word)
            dfs(r, c - 1, node, word)

            visited.remove((r, c))

        for i in range(row):
            for j in range(col):
                dfs(i, j, root, "")

        return list(res)