每日一题--单词搜索(回溯)

288 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:[2021最后一次更文挑战]

题目

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

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

示例 1:

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

示例 2:

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

解析

1.挨个遍历找首字母匹配

2.从匹配的首字母开始往四个方向遍历匹配下一个字母,并记录已访问过的点坐标

3.遍历的过程中如果有字母不匹配返回false

4.遍历的过程中判断越界情况和已访问过的情况

5.直到匹配到最后一个字符完全相同 返回false

6.退出递归记得改掉已访问过的坐标为false

代码

var exist = function(board, word) {
    let row = board.length,
        col = board[0].length;
    if(!word){
        return false
    }
    let mark = new Array(row)
    for (let i = 0; i < row; ++i) {
        mark[i] = new Array(col).fill(false);
    }
    const dfs = (i, j, index)=>{
        if(i<0 || i>=row ||j<0 || j>=col || mark[i][j]){
            return false
        }
        //3.遍历的过程中如果有字母不匹配返回false
        if(board[i][j]!==word.charAt(index)){
            return false
        }
        if(index === word.length-1){
            return true
        }
        mark[i][j] = true
        let bool = dfs(i,j+1,index+1) || dfs(i,j-1,index+1) || dfs(i-1,j,index+1) ||dfs(i+1,j,index+1)
        //退出递归记得改掉已访问过的坐标为false
        mark[i][j] = false

        return bool
    }
    //1.挨个遍历找首字母匹配
    for(let i=0;i<row;i++){
        for(let j=0;j<col;j++){
            let bool = dfs(i,j,0)
            if(bool){
                return true
            }
        }
    }

    return false
};