79. 单词搜索(中)

题目

  • 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

javascript

题解:回溯

var exist = function(board, word) {
    const track =[] 
    const l=word.length
    const n = board.length; // 行数
    const m = board[0].length; // 列数
    const visited = new Array(n) // 创建访问标记数组
    for (let i = 0; i < n; i++) {
        visited[i] = new Array(m).fill(false);//初始化二维数组的值为false
    }
    //i,j 指的是board的索引,index指的是word的索引
    const dfs = (i,j,index) =>{
        //递归出口,当前单词的索引等于单词的长度
        if(index == l){
            return true
        }
        //边界检查:越界、当前字符以访问或不匹配,返回false
        if(i<0 || i>=n || j<0 || j>=m || visited[i][j] || board[i][j] !== word[index]){
            return false
        }

        track.push(board[i][j])//做选择
        visited[i][j] = true //标记当前位置已访问

        //递归
        const found = dfs(i+1,j,index+1) ||//下
        dfs(i-1,j,index+1) || //上
        dfs(i,j+1,index+1) ||//右
        dfs(i,j-1,index+1)//左

        track.pop()//撤销选择
        visited[i][j] = false;

        return found
    }

     for(let i=0;i<n;i++){
            for(let j=0;j<m;j++){
                if(board[i][j] == word[0] && dfs(i,j,0)){// 找到起点且递归结果为真,找到目标路径
                    return true
                }
            }
        }   
        return false  // 怎么样都没有返回true,则返回false
};

python

题解:回溯

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        if not board:   # 边界条件
            return False
        for i in range(len(board)):
            for j in range(len(board[0])):
                if self.backtrack(board, i, j, word):#表示从当前位置 (i, j) 开始,搜索能否匹配整个单词 word。
                    return True
        return False

    def backtrack(self, board, i, j, word):
        if len(word) == 0: # 如果单词已经检查完毕
            return True
        if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or word[0] != board[i][j]:  # 如果路径出界或者矩阵中的值不是word的首字母,返回False
            return False
        tmp = board[i][j]  # 保存当前位置的值
        board[i][j] = '0'  #做选择
        #将四个方向的搜索结果进行合并。如果其中任意一个方向的搜索返回 True,则表示找到了满足条件的路径,将 res 设置为 True。
        res = self.backtrack(board,i+1,j,word[1:]) or self.backtrack(board,i-1,j,word[1:]) or self.backtrack(board,i,j+1,word[1:]) or self.backtrack(board, i, j-1, word[1:]) # 上下左右四个方向搜索,递归 

        board[i][j] = tmp  # 标记过的点恢复原状,以便进行下一次搜索,撤销选择
        return res#res 是一个布尔值变量,用于存储回溯搜索的结果。它表示在当前位置 (i, j) 上,是否存在一条路径可以匹配整个单词 word。
posted @   Frommoon  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示