博客
关于我
剑指 Offer 12. 矩阵中的路径
阅读量:797 次
发布时间:2023-03-29

本文共 1943 字,大约阅读时间需要 6 分钟。

矩阵中的路径问题解析与实现

问题描述

给定一个矩阵和一个目标字符串,判断矩阵中是否存在一个连续的路径,使得路径上的字符依次匹配目标字符串。例如,矩阵中的某个单元格为“X”,目标字符串为“XXX”,则需要检查是否存在三个连续的“X”。

方法选择

为了解决这个问题,选择使用深度优先搜索(DFS)结合剪枝的方法。DFS能够暴力遍历矩阵,逐个检查每个单元格是否能作为目标字符串的起点。剪枝则通过提前终止不可能成功的路径,减少不必要的计算。

方法解析

  • 递归函数设计

    • 函数参数:当前位置(i, j)和目标字符串的当前匹配位置k。
    • 终止条件
      • 当前字符与目标字符不匹配,直接返回false。
      • 已经匹配到目标字符串的最后一个字符,返回true。
    • 递归工作
      • 标记当前位置为已访问。
      • 检查四个方向(上、下、左、右)的相邻单元格。
      • 如果从相邻单元格能够找到目标字符串的剩余部分,返回true。
      • 递归结束后还原当前位置的字符,确保其他递归调用不受影响。
  • 主函数逻辑

    • 遍历整个矩阵,调用递归函数检查每个单元格是否能作为起点。
    • 如果任意一个起点能找到目标字符串,立即返回true。
  • 剪枝优化

    • 避免重复访问单元格,使用一个已访问标记数组。
    • 提前终止不可能成功的路径,如字符不匹配或越界。
  • 代码实现

    package matrix;public class JZ12矩阵中的路径 {    int[][] dirs = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };    public boolean exist(char[][] board, String word) {        int h = board.length;        int w = board[0].length;        boolean[][] visited = new boolean[h][w];        for (int i = 0; i < h; i++) {            for (int j = 0; j < w; j++) {                if (check(board, visited, i, j, word, 0)) {                    return true;                }            }        }        return false;    }    private boolean check(char[][] board, boolean[][] visited, int i, int j, String word, int k) {        if (board[i][j] != word.charAt(k)) {            return false;        }        if (k == word.length() - 1) {            return true;        }        visited[i][j] = true;        for (int[] dir : dirs) {            int newi = i + dir[0];            int newj = j + dir[1];            if (newi >= 0 && newi < board.length && newj >= 0 && newj < board[0].length) {                if (!visited[newi][newj]) {                    if (check(board, visited, newi, newj, word, k + 1)) {                        return true;                    }                }            }        }        visited[i][j] = false;        return false;    }}

    复杂度分析

    • 时间复杂度:O(3^k * M * N),其中k为字符串长度,M和N为矩阵的行数和列数。剪枝后,时间复杂度有所优化。
    • 空间复杂度:O(k),递归深度不超过k,系统栈空间占用较小。

    结论

    通过DFS加剪枝的方法,可以高效地解决矩阵中的路径问题。该方法通过逐个检查每个单元格,并剪枝不可能的路径,确保在合理时间内找到目标字符串或确定其不存在。

    转载地址:http://plhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现字符串加解密(附完整源码)
    查看>>
    Objective-C实现字符串反转(附完整源码)
    查看>>
    Objective-C实现字符串复制功能(附完整源码)
    查看>>
    Objective-C实现字符串是否回文Palindrome算法 (附完整源码)
    查看>>
    Objective-C实现字符串查找子串(附完整源码)
    查看>>
    Objective-C实现完整的ComplexNumber复数类(附完整源码)
    查看>>
    Objective-C实现实现rabin karp算法(附完整源码)
    查看>>
    Objective-C实现对图像进行色调处理算法(附完整源码)
    查看>>
    Objective-C实现对称矩阵压缩存储(附完整源码)
    查看>>
    Objective-C实现寻找欧拉路径/回路(附完整源码)
    查看>>
    Objective-C实现导弹跟踪算法(附完整源码)
    查看>>
    Objective-C实现将 base64 字符串转换为字节数组算法(附完整源码)
    查看>>
    Objective-C实现将位转换为浮点数bitsToFloat算法(附完整源码)
    查看>>
    Objective-C实现将列表向右旋转 k 个位置算法(附完整源码)
    查看>>
    Objective-C实现将字符串中大写字母转换为小写字母(附完整源码)
    查看>>
    Objective-C实现将字符串从一个基转换为另一个基算法(附完整源码)
    查看>>
    Objective-C实现将字节数组转换为 base64 编码算法(附完整源码)
    查看>>
    Objective-C实现将彩色图像转换为负片算法(附完整源码)
    查看>>
    Objective-C实现将无符号整数n变成成d进制表示的字符串s(附完整源码)
    查看>>
    Objective-C实现将给定的 utf-8 字符串编码为 base-16算法(附完整源码)
    查看>>