Word Search II

Problem page:https://leetcode.com/problems/word-search-ii

Solution

class TreeNode:
    def __init__(self):
        self.children = {}
        self.isWord = False
        self.refs = 0
    def addWord(self, word):
        cur = self
        cur.refs += 1
        for letter in word:
            if letter not in cur.children:
                cur.children[letter] = TreeNode()
            cur = cur.children[letter]
            cur.refs += 1
        cur.isWord = True
    def removeWord(self, word):
        cur = self
        cur.refs -= 1
        for letter in word:
            if letter in cur.children:
                cur = cur.children[letter]
                cur.refs -= 1

class Solution:
    def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
        root = TreeNode()
        for w in words:
            root.addWord(w)

        r,c = len(board), len(board[0])

        res, visit = set(), set()

        def dfs(row, col, node, word):
            if row not in range(r) or col not in range(c) or board[row][col] not in node.children or node.children[board[row][col]].refs < 1 or (row,col) in visit:
                return
            visit.add((row,col))

            node = node.children[board[row][col]]
            word += board[row][col]
            if node.isWord:
                node.isWord = False
                res.add(word)
                root.removeWord(word)
            dfs(row + 1, col, node, word)
            dfs(row - 1, col, node, word)
            dfs(row , col + 1, node, word)
            dfs(row , col - 1, node, word)
            visit.remove((row,col))

        for row in range(r):
            for col in range(c):
                dfs(row,col,root,"")
        return list(res)

Complexity

  • time: O( m+n.(4^k) ) m is the number of letters in words, n is the number of letters on board, k is the max length of words or the depth of tree, 4 is the 4 directions
  • space: O(n * m)