2
public boolean placeWordInCrossword(char[][] board, String word) {5
Trie trie = new Trie();7
// Insert all horizontal strings8
for (int i = 0; i < board.length; i++) {9
for (int j = 0; j < board[0].length; j++) {10
if (board[i][j] == '#') {11
insertIntoTrie(trie, curr);17
insertIntoTrie(trie, curr);21
// Insert all vertical strings22
for (int i = 0; i < board[0].length; i++) {23
for (int j = 0; j < board.length; j++) {24
if (board[j][i] == '#') {25
insertIntoTrie(trie, curr);31
insertIntoTrie(trie, curr);35
return trie.isPresent(word);38
// Insert string and reverse of string into the trie39
private void insertIntoTrie(Trie trie, String s) {41
StringBuilder sb = new StringBuilder(s);43
trie.insert(sb.toString());47
Map<Character, TrieNode> children;51
children = new HashMap<>();60
root = new TrieNode();63
void insert(String s) {66
for (int i = 0; i < s.length(); i++) {68
if (!curr.children.containsKey(c)) {69
curr.children.put(c, new TrieNode());72
curr = curr.children.get(c);78
boolean isPresent(String key) {80
return helper(key, 0, root);83
boolean helper(String key, int i, TrieNode curr) {84
if (curr == null) return false;86
if (i == key.length()) return curr.isEnd;88
char c = key.charAt(i);89
return helper(key, i + 1, curr.children.get(c)) || helper(key, i + 1, curr.children.get(' '));