Word Search II

Maybe called many times.

  • Time: O(N)
  • Space: O(1)
public List<String> findWords(char[][] board, String[] words) {
    List<String> res = new ArrayList<>();
    TrieNode root = buildTrie(words);
    for (int i = 0; i < board.length; i++) {
        for (int j = 0; j < board[0].length; j++) {
            dfs(board, i, j, root, res);
        }
    }
    return res;
}

public void dfs(char[][] board, int i, int j, TrieNode p, List<String> res) {
    char c = board[i][j];
    if (c == '#' || p.childs[c - 'a'] == null) return;
    p = p.childs[c - 'a'];
    if (p.word != null) {   // found one
        res.add(p.word);
        p.word = null;     // de-duplicate
    }
    board[i][j] = '#';
    if (i > 0) dfs(board, i - 1, j, p, res);
    if (j > 0) dfs(board, i, j - 1, p, res);
    if (i < board.length - 1) dfs(board, i + 1, j, p, res);
    if (j < board[0].length - 1) dfs(board, i, j + 1, p, res);
    board[i][j] = c;
}

public TrieNode buildTrie(String[] words) {
    TrieNode root = new TrieNode();
    for (String w : words) {
        TrieNode p = root;
        for (char c : w.toCharArray()) {
            int i = c - 'a';
            if (p.childs[i] == null) p.childs[i] = new TrieNode();
            p = p.childs[i];
        }
        p.word = w;
    }
    return root;
}

class TrieNode {
    TrieNode[] childs = new TrieNode[26];
    String word;
}

results matching ""

    No results matching ""