LeetCode-079-单词搜索

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

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

示例:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search

解题思路

利用深度优先搜索的思想
并且需要一个二维数组辅助记录哪些位置已经是"被选到"的
遍历二维数组,尝试以遍历到的元素为递归起点来寻找单词序列
dfs(char[][] board, boolean[][] used, int index, int i, int j, String word)
used 是记录哪些位置在一次搜索中走过,index 是当前要寻找的 word 中的字符的索引
会先判断当前遍历元素是否被记录过,再判断当前位置元素是否是 word[index]
是的话判断 index + 1 是否等于 word 的长度,相等则返回true
否则将此位置标记为使用过,然后 以此位置为基础, 上下左右搜索,搜索完返回时将此位置标记为未使用

代码

class Solution {
    int m;
    int n;
    int[][] direction = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}}; // 上下左右

    public boolean exist(char[][] board, String word) {
        m = board.length;
        n = board[0].length;
        boolean[][] used = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (dfs(board, used, 0, i, j, word)) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean dfs(char[][] board, boolean[][] used, int index, int i, int j, String word) {
        if (!used[i][j] && board[i][j] == word.charAt(index)) {
            if (index + 1 == word.length()) {
                return true;
            }
            used[i][j] = true;
            for (int[] direct : direction) { // 以此位置为基础, 上下左右搜索
                int newI = i + direct[0];
                int newJ = j + direct[1];
                if (isValid(newI, newJ)) {
                    if (dfs(board, used, index + 1, newI, newJ, word)) {
                        return true;
                    }
                }
            }
            used[i][j] = false;
        }
        return false;
    }

    private boolean isValid(int row, int col) {
        return 0 <= row && row < m && 0 <= col && col < n;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容