剑指 Offer 12. 矩阵中的路径

题目描述

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

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

解题思路

方法一:深度优先搜索+剪枝

利用递归,从第一个元素开始,查询临近的四个方向上的元素是否符合要求,若第(i,j)个元素符合则检测该元素四个方向上的元素,不断延申,直到找到字符串或者返回没找到结束递归。

递归返回条件:

根据二维数组四个角的下标(0,0),(rows,0),(rows,cols),(0,cols),我们可以得到当横向边界小于0或者>=rows时,证明已经全部查询完毕;纵向边界<0或者>=cols,证明已经全部查询完毕,并且没有查询到字符串,返回false。(当二维数组有3列时,下标是0,1,2,因此当>=rows时表示已经越界了)

在匹配字符串时,每次匹配一个字符,当我们成功匹配字符串的最后一个时表示查找到了字符串,返回true。

然而在这种情况下会有一种情况,比如在下表中查找"ABCHHHD":

|---|---|---|---|
| A | B | C | D |
| M | A | H | D |
| D | E | H | F |
| U | D | H | I |

我们从A开始,到B,到C,到H,到H ,此时我们已经到达下面的位置:

下一个要寻找的应该是下面的H,可是对于上述情况来说,如果代码中,向上寻找先于向下寻找,那么就会回到上面的H。因此我们需要在本次递归过程中标记已经访问过的元素。因此我们将访问过的并且成功匹配的字符更改内容为'\0',退出本次递归时再还原回去。(因为其他的递归中可能并没有访问这个元素)

代码

cpp 复制代码
class Solution
{
private:
	int rows;
	int cols;
	bool DFS(std::vector<std::vector<char>>& board, std::string word, int i, int j, int k)
    {
        if (i >= rows || i < 0 || j >= cols || j < 0 || board[i][j] != word[k])
                return false;
        if (k == word.size() - 1)
            return true;
        board[i][j] = '\0';
        bool res = DFS(board, word, i + 1, j, k + 1) ||
        DFS(board, word, i - 1, j, k + 1) ||
        DFS(board, word, i, j + 1, k + 1) ||        
        DFS(board, word, i, j - 1, k + 1);
        board[i][j] = word[k];
        return res;    
    }
public:
    bool Solution::exist(std::vector<std::vector<char>>& board, std::string word)
    {
        rows = board.size();
        cols = board[0].size();
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (DFS(board, word, i, j, 0)) return true;
            }
        }
        return false;
    }
};
相关推荐
Jasmine_llq15 小时前
《B4259 [GESP202503 二级] 等差矩阵》
线性代数·矩阵·顺序输入输出算法·双重循环遍历算法·行列乘积计算算法·矩阵逐行输出算法·空格分隔输出算法
代码改善世界19 小时前
【MATLAB初阶】矩阵操作(二):矩阵的运算
android·matlab·矩阵
今日说"法"19 小时前
线性代数与矩阵运算:AI世界的数学基石——从SVD到特征值分解的实战解析
人工智能·线性代数·矩阵
猴哥聊项目管理19 小时前
从职能型组织到矩阵型组织的IPD转型路径
线性代数·矩阵·项目管理·项目经理·ipd流程·ipd项目管理流程·ipd流程管理
清 晨20 小时前
海外社媒内容审核加强跨境卖家如何避免限流
大数据·人工智能·矩阵·新媒体运营·内容营销
源码之家1 天前
计算机毕业设计:Python农产品智能推荐与可视化分析系统 Flask框架 矩阵分解 数据分析 可视化 协同过滤推荐算法 深度学习(建议收藏)✅
python·矩阵·数据挖掘·数据分析·django·flask·课程设计
今日说"法"1 天前
线性代数与矩阵运算:向量、矩阵、特征值、SVD 在 AI 中的全面应用
人工智能·线性代数·矩阵
今日说"法"1 天前
线性代数与矩阵运算:AI 背后的数学基石
人工智能·线性代数·矩阵
承渊政道1 天前
【递归、搜索与回溯算法】(floodfill算法:从不会做矩阵题,到真正掌握搜索扩散思想)
数据结构·c++·算法·leetcode·矩阵·dfs·bfs
剑挑星河月1 天前
73.矩阵置零
数据结构·算法·leetcode·矩阵