剑指 Offer 12. 矩阵中的路径

128 阅读1分钟

剑指 Offer 12. 矩阵中的路径

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

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

  • 先从头遍历矩阵,找到第一个符合的字符,开始深度优先遍历
  • 深度优先遍历:
    1. 定义index代表索引,或者说已经匹配了多少个字符
    2. 要写递归的出口:i、j越界或者字符不匹配
    3. 匹配成功:index等于word.length - 1,匹配成功,直接返回true
    4. 为了同一个单元格内的字母不允许被重复使用,遍历到某字符后,将当前字符设置为'',防止四个方向dfs再次遍历到
    5. 四个方向遍历完毕后,再恢复这个字符
  • 最后若一直匹配失败,返回false

var exist = function (arr, str) {
    if (!arr) return false
    var m = arr.length;
    var n = arr[0].length;
    for (var i = 0; i < m; i++) {
        for (var j = 0; j < n; j++) {
            if (dfs(i, j, 0)) return true
        }
    }
    function dfs(i, j, x) {
        if (i < 0 || j < 0 || i >= m || j >= n || arr[i][j] != str[x]) return false
        if (x == str.length - 1) return true
        var mid = arr[i][j]
        arr[i][j] = ""
        var res = dfs(i + 1, j, x + 1) || dfs(i, j + 1, x + 1) || dfs(i - 1, j, x + 1) || dfs(i, j - 1, x + 1)
        arr[i][j] = mid
        return res
    }
    return false
};