LeetCode_回溯_中等_79.单词搜索

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

LeetCode_回溯_中等_79.单词搜索_第1张图片

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

示例 2:

LeetCode_回溯_中等_79.单词搜索_第2张图片

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true

示例 3:

LeetCode_回溯_中等_79.单词搜索_第3张图片

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
输出:false

提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成

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

2.思路

(1)回溯算法
本思路参考本题的官方题解。

相关题目:
LeetCode_前缀树_困难_212.单词搜索 II

3.代码实现(Java)

//思路1————回溯算法
class Solution {

    //定义上、下、左、右这4个方向
    int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    
    public boolean exist(char[][] board, String word) {
        int m = board.length;
        int n = board[0].length;
        /*
            visited[i][j] == true 表示在每一轮搜索中,字符 board[i][j] 已经访问过了
            此处的每一轮搜索指的是以二维字符网格 board 中的每一个字符作为起点开始搜索,当每访问一个字符 board[i][j],
            就将 visited[i][j] 设置为 true,当该轮搜索结束后,再将 visited[i][j] 设置为 false
        */
        boolean[][] visited = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                //遍历二维字符网格 board,每遇到一个字符 board[i][j],就以它为起点开始搜索 word
                if (judge(i, j, word, 0, board, visited)) {
                    return true;
                }
            }
        }
        return false;
    }
    
    /* 
        i、j: 表示当前正在访问的二维字符网格中字符的横坐标和纵坐标
        k: 表示匹配 word 中字符的下标
    */
    public boolean judge(int i, int j, String word, int k, char[][] board, boolean[][] visited) {
        if (board[i][j] != word.charAt(k)) {
            return false;
        } else if (word.length() - 1 == k) {
            // word 的每一个字符都已匹配成功,即 word 存在于网格中,返回 true
            return true;
        }
        //字符 board[i][j] 在此轮搜索中已经被访问过
        visited[i][j] = true;
        boolean flag = false;
        //分别向 4 个方向开始搜索
        for (int[] dir : dirs) {
            int newi = i + dir[0];
            int newj = j + dir[1];
            if (newi >= 0 && newj >= 0 && newi < board.length && newj < board[0].length) {
                if (!visited[newi][newj] && judge(newi, newj, word, k + 1, board, visited)) {
                    flag = true;
                    break;
                }
            }
        }
        //本轮搜索结束
        visited[i][j] = false;
        return flag;
    }
}

你可能感兴趣的:(LeetCode,算法刷题,leetcode,回溯)