这是我参与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
};