Сложность: medium
Дана сетка символов размером m на n, называемая board, и строка word. Верните true, если слово word существует в сетке.
Слово можно составить из букв последовательно смежных ячеек, где смежные ячейки находятся рядом по горизонтали или вертикали. Одна и та же ячейка с буквой не может быть использована более одного раза.
Пример:
Input: board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
Output: true
👨💻 Алгоритм:
1️⃣Общий подход к алгоритмам обратной трассировки: В каждом алгоритме обратной трассировки существует определенный шаблон кода. Например, один из таких шаблонов можно найти в нашем разделе "Рекурсия II". Скелет алгоритма представляет собой цикл, который проходит через каждую ячейку в сетке. Для каждой ячейки вызывается функция обратной трассировки (backtrack()), чтобы проверить, можно ли найти решение, начиная с этой ячейки.
2️⃣Функция обратной трассировки: Эта функция, реализуемая как алгоритм поиска в глубину (DFS), часто представляет собой рекурсивную функцию. Первым делом проверяется, достигнут ли базовый случай рекурсии, когда слово для сопоставления пусто, то есть для каждого префикса слова уже найдено совпадение. Затем проверяется, не является ли текущее состояние недопустимым: либо позиция ячейки выходит за границы доски, либо буква в текущей ячейке не совпадает с первой буквой слова.
3️⃣Исследование и завершение: Если текущий шаг допустим, начинается исследование с использованием стратегии DFS. Сначала текущая ячейка помечается как посещенная, например, любой неалфавитный символ подойдет. Затем осуществляется итерация через четыре возможных направления: вверх, вправо, вниз и влево. Порядок направлений может быть изменен по предпочтениям пользователя. В конце исследования ячейка возвращается к своему исходному состоянию, и возвращается результат исследования.
😎 Решение:
var exist = function (board, word) {
const ROWS = board.length;
const COLS = board[0].length;
const backtrack = function (row, col, suffix) {
if (suffix.length == 0) return true;
if (
row < 0 ||
row == ROWS ||
col < 0 ||
col == COLS ||
board[row][col] != suffix.charAt(0)
)
return false;
let ret = false;
board[row][col] = "#";
const directions = [
[0, 1],
[1, 0],
[0, -1],
[-1, 0],
];
for (let [rowOffset, colOffset] of directions) {
ret = backtrack(row + rowOffset, col + colOffset, suffix.slice(1));
if (ret) break;
}
board[row][col] = suffix.charAt(0);
return ret;
};
for (let row = 0; row < ROWS; ++row) {
for (let col = 0; col < COLS; ++col) {
if (backtrack(row, col, word)) return true;
}
}
return false;
};Ставь 👍 и забирай 📚 Базу знаний
