Cho một bảng 2D và một từ, tìm xem từ đó có tồn tại trong lưới không. Từ có thể được tạo thành từ các chữ cái của các ô liền kề tuần tự, trong đó các ô 'liền kề' là hàng xóm theo chiều ngang hoặc chiều dọc.
Giải thích: Điều này yêu cầu một tìm kiếm theo chiều sâu (DFS) với quay lui. Lặp qua từng ô. Nếu một ô khớp với chữ cái đầu tiên của từ, hãy bắt đầu DFS. Hàm DFS kiểm tra các ô lân cận, đảm bảo chúng khớp với chữ cái tiếp theo và chưa được truy cập trong đường dẫn hiện tại. Nếu một đường dẫn thất bại, quay lui bằng cách bỏ đánh dấu ô.
function exist(board, word) {
const rows = board.length;
const cols = board[0].length;
function dfs(r, c, index) {
if (index === word.length) return true; // Word found
if (r < 0 || c < 0 || r >= rows || c >= cols || board[r][c] !== word[index]) {
return false;
}
const temp = board[r][c];
board[r][c] = '#'; // Mark as visited
const found = dfs(r + 1, c, index + 1) ||
dfs(r - 1, c, index + 1) ||
dfs(r, c + 1, index + 1) ||
dfs(r, c - 1, index + 1);
board[r][c] = temp; // Backtrack
return found;
}
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (board[r][c] === word[0] && dfs(r, c, 0)) {
return true;
}
}
}
return false;
}
const board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']];
console.log(exist(board, 'ABCCED')); // true
console.log(exist(board, 'SEE')); // true
console.log(exist(board, 'ABCB')); // false