题目
- 给定一个 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。