剑指offer65_矩阵中的路径_题解

矩阵中的路径

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如

\[\begin{bmatrix} a & b & c &e \\ s & f & c & s \\ a & d & e& e\\ \end{bmatrix} \]

矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

示例1

输入

"ABCESFCSADEE",3,4,"ABCCED"

返回值

true

示例2

输入

"ABCESFCSADEE",3,4,"ABCB"

返回值

false

分析

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

代码

/*
1.时间复杂度:O(n)
2.空间复杂度:O(k)
k为字符串长度
*/
class Solution
{
public:
    bool vis[250][250] = {false};
    vector<vector<int>> dir = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};

    bool dfs(char *matrix, int i, int j, int r, int c, int k, char *str)
    {
        if (k == strlen(str))
            return true;

        for (vector<int> d : dir)
        {
            int newi = i + d[0], newj = j + d[1];
            if (newi < 0 || newi >= r || newj < 0 || newj >= c || vis[newi][newj] || matrix[newi * c + newj] != str[k])
                continue;
            vis[newi][newj] = true;
            if (dfs(matrix, newi, newj, r, c, k + 1, str))
                return true;
            vis[newi][newj] = false;
        }
        return false;
    }
    bool hasPath(char *matrix, int r, int c, char *str)
    {
        for (int i = 0; i < r; ++i)
        {
            for (int j = 0; j < c; ++j)
            {
                if (matrix[i * c + j] == str[0])
                {
                    vis[i][j] = true;
                    if (dfs(matrix, i, j, r, c, 1, str))
                        return true;
                    vis[i][j] = false;
                }
            }
        }
        return false;
    }
};
posted @ 2021-03-04 22:08  RiverCold  阅读(58)  评论(0编辑  收藏  举报