回溯

单词搜索

中等#79Java时间 O(mn·3ᴸ),L 为单词长度空间 O(L)

题目要做什么

判断能否在字符网格中沿上下左右相邻格拼出 word。同一个格子在同一条路径中最多使用一次。

题目示例输入board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
题目示例输出true

01 为什么这样做

从每个格子尝试 DFS。字符匹配后暂时标记格子已用,再搜索下一字符;返回前恢复格子。这样其他搜索路径仍能使用它。

始终成立的条件

被标记的格子恰好是当前搜索路径,恢复后 board 与调用前一致。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public boolean exist(char[][] board, String word) {3        for (int r = 0; r < board.length; r++) {4            for (int c = 0; c < board[0].length; c++) {5                if (search(board, word, r, c, 0)) return true;6            }7        }8        return false;9    }10    private boolean search(char[][] board, String word, int r, int c, int index) {11        if (r < 0 || c < 0 || r >= board.length || c >= board[0].length12                || board[r][c] != word.charAt(index)) return false;13        if (index == word.length() - 1) return true;14        char saved = board[r][c];15        board[r][c] = '';16        boolean found = search(board, word, r + 1, c, index + 1)17            || search(board, word, r - 1, c, index + 1)18            || search(board, word, r, c + 1, index + 1)19            || search(board, word, r, c - 1, index + 1);20        board[r][c] = saved;21        return found;22    }23}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索