LeetCode Everyday - 矩阵中的路径

97 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情 >>

矩阵中的路径

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

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

 

例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

image.png

示例1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例2:

输入: board = [["a","b"],["c","d"]], word = "abcd"
输出: false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 仅由大小写英文字母组成

解题思路:

1.查找二维数组所有位置,找到与word[0]相同的值,也就是整个路径的起点
2.传入查找到的点的横坐标与纵坐标,开始递归

细节:
1.用 ||来求得bool值,这样如果前面第一个式子计算为true后面都不会用再计算了
2.计算步长要写到前面,否则在计算到越界情况的时候会出错。
3.column要重置为0,当然,如果用for循环就没这种顾虑了

我的答案:

var exist = function (board, word) {
    let flag = false
    let row = 0, column = 0
    //2.找到起点后就可以递归
    const searchPath = (row, column, step) => {
        //如果步长已经相等说明已经找到  这个必须放到越界之前
        if (step == word.length) {
            return true
        }
        //如果数组越界则返回false
        if (row == board.length || column == board[0].length || row < 0 || column < 0) {
            return false
        }
        let tmp = board[row][column]
        //如果该值等于word
        if (tmp == word[step]) {
            //赋值为. 这就表示已经走过这一边之后不可再走
            board[row][column] = "."
            let value = searchPath(row + 1, column, step + 1) || searchPath(row, column + 1, step + 1) || searchPath(row - 1, column, step + 1) || searchPath(row, column - 1, step + 1)
            //还原之前赋值为.的数组值
            board[row][column] = tmp
            return value
        } else {
            return false
        }
    }
    //1.遍历找矩阵起点
    while (row < board.length) {
        while (column < (board[0].length)) {
            //找到起点
            if (board[row][column] == word[0]) {
                //如果找到了就返回
                if(searchPath(row, column, 0)){
                    return true
                }
            }
            column++
        }
        //column要重置为0才行
        column = 0
        row++
    }
    //找不到路径就返回false
    return false
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )