【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;
        }
    }  
};
相关文章
|
3天前
leetcode代码记录(二叉树的所有路径
leetcode代码记录(二叉树的所有路径
8 0
|
3天前
|
机器人
leetcode代码记录(不同路径 II
leetcode代码记录(不同路径 II
6 0
|
3天前
|
机器人
leetcode代码记录(不同路径
leetcode代码记录(不同路径
9 0
|
17天前
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
|
24天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
25天前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
17 0
|
2月前
leetcode热题100.二叉树中的最大路径和
leetcode热题100.二叉树中的最大路径和
18 0
|
2月前
|
vr&ar
leetcode热题100.路径总和 III
leetcode热题100.路径总和 III
20 1
|
3天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
6 0
|
3天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
8 0

热门文章

最新文章