leetcode——矩阵中的路径

182 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

前言

力扣练习第7天,拒绝思路老化。今天要练习的是: 矩阵中的路径

题目信息如下:

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

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

 

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

image.png


/**
 * @param {character[][]} board
 * @param {string} word
 * @return {boolean}
 */
 
/**
 * board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], 
 * word = "ABCCED"
 * return true
 */

/**
 * board = [["a","b"],["c","d"]], 
 * word = "abcd"
 * return false
 */

解法

这道题,个人认为就是一个很经典的深度递归问题。我们需要对二维数组进行遍历,找到符合条件的单词开头,然后从该位置的四周开始寻找,找到符合条件的继续去下一个字母的四周去寻找下一个符合条件的字母,为了避免回头,每次找到之后我们需要将当前位置的字母置为空。递归截止条件需符合以下几条之一:

  • col < 0
  • col >= board[0].length
  • row < 0
  • row >= board.length
  • board[row][col] !== word[k]
var exist = function(board, word) {
    function dfs(i, j, k){
        if(i < 0 || i >= row || j < 0 || j >= col || board[i][j] !== word[k]) return false;
        if(k === len - 1) return true;
        const temp = board[i][j];
        board[i][j] = '';
        const res = dfs(i-1, j, k+1) || dfs(i, j+1, k+1) || dfs(i+1, j, k+1) || dfs(i, j-1, k+1);
        board[i][j] = temp;
        return res;
    }
    let row = board.length,col = board[0].length,len = word.length;
    for(let i = 0; i < row; i++) {
        for(let j = 0; j < col; j++){
            if(dfs(i, j, 0)) return true;
        }
    }

    return false;
};