50,单词搜索
题目描述
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
题解
代码:
/**
回溯,声明一个check方法,该方法就是检查以该位置开始时,是否能查到word字符串
*/
var exist = function (board, word) {
let m = board.length, n = board[0].length
// 声明一个标记数组,用来标记在回溯过程中经过的字母
let visited = new Array(m).fill(0).map(v => new Array(n).fill(false))
// 探索上下左右的数组
const des = [[0, 1], [0, -1], [1, 0], [-1, 0]]
const len = word.length
// 遍历一个数组,每一个都探索一次
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
let temp = check(i, j, 0)
if (temp) {
return true
}
}
}
return false
// 递归方法
function check(i, j, s) {
// 如果是数组中的该值不等于该字符 那比对失败
// 如果这时候该值已经等于该字符时,并且这个字符是最后一个字符的时候
// 就说明比对成功,返回true
if (board[i][j] !== word[s]) {
return false
}else if(s == len - 1){
return true
}
// 标记返回的结果
let flag = false
// 标记该元素已经访问过
visited[i][j] = true
// 从上下左右四个方向开始探索
for (let k = 0; k < des.length; k++) {
let nexti = i + des[k][0], nextj = j + des[k][1]
// 探索的坐标 满足规定 并且满足没有被访问过的条件
if (nexti < m && nexti >= 0 && nextj < n && nextj >= 0) {
if(!visited[nexti][nextj]){
// 开始对这个坐标进行递归
let temp = check(nexti,nextj,s + 1)
// 如果这个结果为true的时候,那就结束递归 说明找到了
if(temp){
flag = true
break
}
}
}
}
// 这是回溯的操作,退回这个元素
visited[i][j] = false
return flag
}
};