leetcode 单词搜索 dfs

本文介绍了一种在二维网格中查找特定单词的算法实现。通过深度优先搜索(DFS)策略,遍历网格上的每个单元格,检查是否能按顺序构成目标单词。文章详细解释了递归函数的工作原理,并提供了完整的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

79. 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

一道经典的深搜题,在此记录下。

 

public class 单词搜索 {
    int[] dx = {-1, 0, 1, 0};
    int[] dy = {0, 1, 0, -1};
    public boolean exist(char[][] board, String word) {
        if (word.length() == 0 || board.length == 0) {
            return false;
        }
        int m = board.length;
        int n = board[0].length;

        boolean[][] vis = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == word.charAt(0)) {
                    vis[i][j] = true;
                    if (dfs(board, i, j, 1, vis, word)) {
                        return true;
                    }
                    vis[i][j] = false;
                }
            }
        }
        return false;
    }

    private boolean dfs(char[][] board, int x, int y, int cur, boolean[][] vis, String word) {

        if (cur == word.length()) {
            return true;
        }
        for (int i = 0; i < 4; i++) {
            int nx = dx[i] + x;
            int ny = dy[i] + y;
            if (nx >= 0 && nx < board.length && ny >= 0 && ny < board[0].length && !vis[nx][ny]) {
                if (board[nx][ny] == word.charAt(cur)) {
                    vis[nx][ny] = true;
                    if (dfs(board, nx, ny, cur + 1, vis, word)) {
                        return true;
                    }
                    vis[nx][ny] = false;
                }
            }
        }
        return false;

    }

    public static void main(String[] args) {
        char[][] board =
                {
                        {'A', 'B', 'C', 'E'},
                        {'S', 'F', 'C', 'S'},
                        {'A', 'D', 'E', 'E'}
                };
        单词搜索 obj = new 单词搜索();
        System.out.println(obj.exist(board, "ABCCED"));
        System.out.println(obj.exist(board, "SEE"));
        System.out.println(obj.exist(board, "ABCB"));
    }
}

### LeetCode 矩阵单词搜索 解决方案 对于矩阵中的单词搜索问题,目标是在一个二维字符网格 `board` 中到指定的字符串 `word`。该算法通过回溯法实现,在遍历过程中尝试匹配每一个可能的方向直到完成整个单词的匹配。 #### 方法概述 为了有效地解决这个问题,采用深度优先搜索(DFS)配合回溯的方法来探索所有潜在路径。每当访问到一个新的位置时,检查当前位置上的字符是否等于当前待匹配的目标字母;如果是,则继续向四个方向扩展搜索范围(上下左右),并重复此过程直至完全匹配或无法进一步前进为止。 具体来说: - 对于每个起始点 `(i, j)` ,启动一次新的 DFS 进程。 - 使用辅助函数 `_dfs(x, y, index)` 来递归地执行实际的搜索操作,其中参数分别代表坐标以及正在处理的单词索引。 - 如果成功到了一条完整的路径使得从起点出发能够按顺序拼接出所需单词,则立即终止程序返回 True 作为结果标志位。 - 否则,在穷尽所有可能性之后仍未发现符合条件的情况时给出 False 表明不存在这样的路径[^2]。 下面是 Python 版本的具体实现方式: ```python def exist(board, word): rows, cols = len(board), len(board[0]) path = set() def dfs(r, c, i): if i == len(word): return True if (r < 0 or c < 0 or r >= rows or c >= cols or \ word[i] != board[r][c] or (r,c) in path): return False path.add((r, c)) res = (dfs(r + 1, c, i + 1) or \ dfs(r - 1, c, i + 1) or \ dfs(r, c + 1, i + 1) or \ dfs(r, c - 1, i + 1)) path.remove((r, c)) return res for row in range(rows): for col in range(cols): if dfs(row, col, 0): return True return False ``` 这段代码定义了一个名为 `exist()` 的函数用于接收输入参数——即要查询的字符数组 `board` 及目标字符串 `word` ——并通过调用内部定义的帮助方法 `_dfs()` 实现对整个棋盘空间的有效覆盖与逐层深入式的检索工作流程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值