【LeetCode剑指offer12】矩阵中的路径(dfs回溯)

简介: 递归参数: 当前字符在矩阵 grid 中的行索引 i 和列索引 j ,当前目标字符(匹配的)在目标字符串 word 中的索引 k 。

一、题目


image.pngimage.png


二、思路

递归参数: 当前字符在矩阵 grid 中的行索引 i 和列索引 j ,当前目标字符(匹配的)在目标字符串 word 中的索引 k 。

终止条件:

返回 false :当前字符和目标字符不匹配,需要return false没必要继续dfs了,而这里也可以不判断位置坐标是否越界,直接写到四个dfs前也行;

返回 true : 当前目标字符(匹配的)在目标字符串 word 中的索引 k = len(word) - 1 ,即目标字符串 word 已全部匹配;

递归过程:

标记访问过字符(方法一):单独设置visited二维布尔数组,如果访问过当前位置的元素,则赋值为true。

标记访问过字符(方法二): 将 grid[i][j] 修改为 ‘/’ ,代表此元素已访问过,防止之后搜索时重复访问。

搜索当前字符的下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归,并记录结果至布尔变量 flag 。

回溯当前字符: 将 board[i][j] 元素还原至初始值 。

返回值: 返回布尔量 result ,代表是否搜索到目标字符串。

三、代码

class Solution {
private:
    vector<pair<int,int>>directions{{0,1},{0,-1},{1,0},{-1,0}};
public:
    bool exist(vector<vector<char>>& grid, string word) {
        int high = grid.size();
        int width = grid[0].size();
        vector<vector<int>> visited(high, vector<int>(width));
        //分别从每个单词开始dfs
        for(int i = 0; i < high; i++){
            for(int j = 0; j < width; j++){
                bool flag = dfs(grid, visited, i, j, word, 0);
                if(flag){
                    return true;
                }
            }
        }
        return false;
    }
    bool dfs(vector<vector<char>>&grid, 
             vector<vector<int>>&visited, int i, int j,
             string& word, int k){
        if(grid[i][j] != word[k]){
            //当前字符不匹配
            return false;
        }
        if(k == word.length() - 1){
            //当前已经访问到末尾,即完成word匹配
            return true;
        }
        //标记访问过
        visited[i][j] = true;
        bool result = false;
        for(auto dir: directions){
            int x = i + dir.first, y = j + dir.second;
            //若没有越界
            if(isarea(grid, x, y)){
                //若没有访问过
                if(!visited[x][y]){
                    bool flag = dfs(grid, visited, x, y, word, k + 1);
                    if(flag){
                       result = true;
                       break; 
                    }
                }
            }
        }
        //恢复原状
        visited[i][j] = false;
        return result;
    }
    bool isarea(vector<vector<char>>&grid,int x,int y){//判断点是否在网格内
        if(x>=0 && x<grid.size() && 0<=y && y<grid[0].size()){
            return true;
        }else{
            return false;
        }
    }  
};
相关文章
|
1月前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
23 0
|
1月前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
28 0
|
3月前
|
存储 算法 NoSQL
LeetCode第73题矩阵置零
文章介绍了LeetCode第73题"矩阵置零"的解法,通过使用矩阵的第一行和第一列作为标记来记录哪些行或列需要置零,从而在不增加额外空间的情况下解决问题。
LeetCode第73题矩阵置零
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
55 6
|
1月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
12 0
|
1月前
|
算法 C++
Leetcode第59题(螺旋矩阵2)
这篇文章介绍了解决LeetCode第59题“螺旋矩阵II”的算法,通过C++编程实现按顺时针顺序填充一个n x n的正方形矩阵。
15 0
|
3月前
|
存储 算法 Linux
LeetCode第71题简化路径
文章讲述了LeetCode第71题"简化路径"的解题方法,利用栈的数据结构特性来处理路径中的"."和"..",实现路径的简化。
LeetCode第71题简化路径
|
3月前
|
算法
LeetCode第64题最小路径和
LeetCode第64题"最小路径和"的解题方法,运用动态规划思想,通过构建一个dp数组来记录到达每个点的最小路径和,从而高效求解。
LeetCode第64题最小路径和
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
50 6
|
3月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
22 3