Бесплатная бета: 60 дней полного доступа, без карты.мест осталось: 84Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности

Все паттерны

Поиск слова в матрице (DFS/backtracking по сетке)

Matrix word search (grid DFS/backtracking)

O(mn*4L)

Ищите в сетке, шагая в соседа и потом возвращаясь обратно. Клетка помечена ровно столько времени, сколько вы внутри неё.

Обновлено 29 окт. 2026 г.

Поиск слова в матрице (DFS/backtracking по сетке): как это работает?

Слово может начинаться в любой клетке. Пробуйте поиск из каждой.

В клетке сравните её с текущим символом. Несовпадение сразу обрывает эту ветку.

Пометьте клетку использованной до шага дальше. Иначе путь пройдёт сам по себе.

Попробуйте по очереди всех четырёх соседей. Слово может продолжиться через любого.

Снимите пометку после возврата всех четырёх вызовов. Следующий поиск обязан увидеть клетку свободной.

Дойти до конца слова значит найти его. Ниже этой точки ничего не важно.

Источники: Википедия: Поиск с возвратом

  1. старт в A, индекс 0Сетка это A, B над C, D, а слово это ABD.
  2. сосед B, индекс 1B совпадает со второй буквой, поэтому тоже помечается.
  3. из B: A помеченаИменно пометка не даёт пути повернуть назад.
  4. D, индекс 2D совпадает с последней буквой. Слово собрано.
  5. ответ = истинаПомечены были две клетки, и обе очищаются на выходе.
Поиск слова "TOP" на сетке букв
exist([["C", "A", "T", "S"], ["A", "X", "T", "O"], ["T", "O", "P", "S"]], "TOP")
board (подсвечены клетки текущего пути)
0123
0CATS
1AXTO
2TOPS
word
TOP
i = 0path = -

Можно ли пройти "TOP" по соседним клеткам доски, не беря ни одну клетку дважды? Пробуем начать с каждой клетки по очереди.

Поиск слова в матрице (DFS/backtracking по сетке): шаблон кода

function exist(board, word) {
    const rows = board.length, cols = board[0].length;
    function dfs(r, c, i) {
        if (i === word.length) return true;
        if (r < 0 || r >= rows || c < 0 || c >= cols || board[r][c] !== word[i]) return false;
        const tmp = board[r][c];
        board[r][c] = "#";
        const found = dfs(r + 1, c, i + 1) || dfs(r - 1, c, i + 1) ||
                      dfs(r, c + 1, i + 1) || dfs(r, c - 1, i + 1);
        board[r][c] = tmp;
        return found;
    }
    for (let r = 0; r < rows; r++) {
        for (let c = 0; c < cols; c++) {
            if (dfs(r, c, 0)) return true;
        }
    }
    return false;
}

Поиск слова в матрице (DFS/backtracking по сетке): разбор примера

Найти все слова, спрятанные в сетке

Даны сетка букв и список слов. Верните все слова, которые есть в сетке.

Поиск каждого слова по отдельности повторяет огромный объём работы.

Сначала сложите все слова в trie.

Потом пройдите сетку один раз, неся узел trie вместо индекса в слове. Отсутствующий потомок обрезает ветку.

function findWords(board, words) {
    const root = { children: {} };
    for (const word of words) {
        let node = root;
        for (const c of word) {
            node.children[c] = node.children[c] ?? { children: {} };
            node = node.children[c];
        }
        node.word = word;
    }

    const found = [];

    function walk(r, c, node) {
        const letter = board[r]?.[c];
        const next = letter && node.children[letter];
        if (!next) return; // no word continues this way

        if (next.word) {
            found.push(next.word);
            next.word = null; // never report the same word twice
        }

        board[r][c] = "#"; // marked only while we are inside this cell
        walk(r + 1, c, next);
        walk(r - 1, c, next);
        walk(r, c + 1, next);
        walk(r, c - 1, next);
        board[r][c] = letter;
    }

    for (let r = 0; r < board.length; r++) {
        for (let c = 0; c < board[0].length; c++) walk(r, c, root);
    }

    return found;
}

Поиск слова в матрице (DFS/backtracking по сетке): когда применять?

Паттерн «Поиск слова в матрице (DFS/backtracking по сетке)» нужен, когда в условии есть слова «существует ли слово как путь по доске», «проследить буквы через соседние клетки без повторов» или «DFS с возвратом (backtracking) по сетке». Решение на нём обычно укладывается в O(mn*4^L).

  • существует ли слово как путь по доске
  • проследить буквы через соседние клетки без повторов
  • DFS с возвратом (backtracking) по сетке
  • пометить клетку посещённой, затем отменить пометку

Слова в условии для всех паттернов собраны в одной таблице: шпаргалка по паттернам алгоритмов.

Поиск слова в матрице (DFS/backtracking по сетке): с чем путают?

Паттерн «Поиск слова в матрице (DFS/backtracking по сетке)» чаще всего путают с этими паттернами: Бэктрекинг, Обход графа BFS / DFS, Компоненты связности и Trie (префиксное дерево).

  • Бэктрекинг (Backtracking): Это бэктрекинг по сетке вместо дерева. Варианты хода это четыре соседа.
  • Обход графа BFS / DFS (Graph BFS / DFS): Обход помечает клетку раз и навсегда. Здесь пометка снимается на выходе.
  • Компоненты связности (Connected components): Заливка тоже ходит по соседям, но пометки не снимает. Она считает, а не ищет.
  • Trie (префиксное дерево) (Trie (prefix tree)): Когда слов много, trie обрезает обход. Без него каждое слово стоит своего поиска.

Поиск слова в матрице (DFS/backtracking по сетке): частые ошибки

  • Забывают снять пометку

    Клетка остаётся закрытой для всех последующих поисков. Восстанавливайте её после четырёх вызовов.

  • Помечают настоящей буквой

    Метка, которая встречается в словах, позволяет пути пройти клетку заново. Возьмите символ вне алфавита.

  • Проверяют границы после чтения

    Чтение вне сетки падает или даёт undefined. Проверяйте координаты до обращения.

  • Ищут каждое слово отдельно

    Сто слов означают сто полных обходов. Один trie сводит их к единственному обходу.

Паттерн «Поиск слова в матрице (DFS/backtracking по сетке)» решает такие задачи с собеседований: Поиск слова в сетке, Поиск слов в сетке II, Число островов, Путь с наибольшим золотом, Уникальные пути III, Крыса в лабиринте и Решатель судоку.

  • Поиск слова в сетке: Одно слово, четыре соседа на каждом шаге.
  • Поиск слов в сетке II: Trie обрезает обход, когда слов много.
  • Число островов: Тот же обход, только пометки не снимаются.
  • Путь с наибольшим золотом: Соберите значение и верните его на выходе.
  • Уникальные пути III: Каждую свободную клетку надо посетить ровно один раз.
  • Крыса в лабиринте: Та же форма, но записывается сам путь.
  • Решатель судоку: Сетка, где варианты это цифры, а не направления.

Поиск слова в матрице (DFS/backtracking по сетке): сложность по времени и памяти

У паттерна «Поиск слова в матрице (DFS/backtracking по сетке)» целевая сложность O(mn*4L).

Сетка r на c и слово длины L стоят O(rc умножить на 4L). Работает это за счёт обрезки.

Где этот паттерн стоит в 150 шагах