class TrieNode {
constructor() {
this.children = new Map();
this.word = null;
}
}
function findWords(grid, words) {
const root = new TrieNode();
for (const word of words) {
let node = root;
for (const char of word) {
if (!node.children.has(char)) {
node.children.set(char, new TrieNode());
}
node = node.children.get(char);
}
node.word = word;
}
const result = [];
const rows = grid.length;
const cols = grid[0].length;
function dfs(row, col, node) {
if (
row < 0 ||
row >= rows ||
col < 0 ||
col >= cols
) {
return;
}
const char = grid[row][col];
if (char === "#" || !node.children.has(char)) {
return;
}
const nextNode = node.children.get(char);
if (nextNode.word !== null) {
result.push(nextNode.word);
nextNode.word = null;
}
grid[row][col] = "#";
dfs(row + 1, col, nextNode);
dfs(row - 1, col, nextNode);
dfs(row, col + 1, nextNode);
dfs(row, col - 1, nextNode);
grid[row][col] = char;
}
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
dfs(row, col, root);
}
}
return result;
}