剑指offer | 矩阵中的路径(类似单词搜索 bool型DFS C++)

题目描述(中等难度)

原题链接
在这里插入图片描述

算法

(DFS 回溯) O ( n m 3 k ) O(n*m*3^k)
类似题目:LeetCode题解 | 79.单词搜索(经典DFS回溯 C++)

  • 先枚举单词的起点( n m n*m 个),然后依次枚举单词的每个字母
  • 在这个过程中用st数组标记字母是否被访问过
  • 当然也可以直接将已经使用过的字母改成一个特殊字母来标记是否访问过,这样可以减少一部分空间开销
  • DFS出口说明:搜索中DFS参数 u = 1 u=1 时已经搜到了2个数,所以你要搜n个数,那设置出口 u = n 1 u=n−1 即可

时间复杂度是 O ( n m 3 k ) O(n*m*3^k) :单词起点一共有 n 2 n^2 个,每个点最多有 3 k 3^k 次可能(k为单词的长度)

C++代码

class Solution {
public:
    static const int N = 100;
    bool st[N][N];
    int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
    
    // dfs中i = 0表示已经匹配了下标为0的位置
    bool dfs(char* matrix, int rows, int cols, int x, int y, int u, char* str) {
        if (u + 1 == strlen(str)) return true;
        
        for (int d = 0; d < 4 ; d ++) {
            int a = x + dx[d], b = y + dy[d];
            if (a < 0 || a >= rows || b < 0 || b >= cols) continue;
            if (st[a][b] == true) continue;
            if (matrix[a * cols + b] != str[u + 1]) continue;
        
            st[a][b] = true;
            if (dfs(matrix, rows, cols, a, b, u + 1, str)) return true;
            st[a][b] = false; // 恢复现场
        }
        return false;
    }
    
    bool hasPath(char* matrix, int rows, int cols, char* str){
        memset(st, 0 ,sizeof st);  // 初始化
        for (int i = 0; i < rows; i ++) {
            for (int j = 0; j < cols; j ++) {
                st[i][j] = true;
                 // 当第一个字母匹配时,我们再进行DFS
                if ((matrix[i * cols + j] == str[0]) && dfs(matrix, rows, cols, i, j, 0, str)) return true;
                st[i][j] = false;
            }
        }
        return false;
    }
};

写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

发布了248 篇原创文章 · 获赞 89 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104393086