携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情 >>
矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
示例1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例2:
输入: board = [["a","b"],["c","d"]], word = "abcd"
输出: false
提示:
- m == board.length
- n = board[i].length
- 1 <= m, n <= 6
- 1 <= word.length <= 15
- board 和 word 仅由大小写英文字母组成
解题思路:
1.查找二维数组所有位置,找到与word[0]相同的值,也就是整个路径的起点
2.传入查找到的点的横坐标与纵坐标,开始递归
细节:
1.用 ||来求得bool值,这样如果前面第一个式子计算为true后面都不会用再计算了
2.计算步长要写到前面,否则在计算到越界情况的时候会出错。
3.column要重置为0,当然,如果用for循环就没这种顾虑了
我的答案:
var exist = function (board, word) {
let flag = false
let row = 0, column = 0
//2.找到起点后就可以递归
const searchPath = (row, column, step) => {
//如果步长已经相等说明已经找到 这个必须放到越界之前
if (step == word.length) {
return true
}
//如果数组越界则返回false
if (row == board.length || column == board[0].length || row < 0 || column < 0) {
return false
}
let tmp = board[row][column]
//如果该值等于word
if (tmp == word[step]) {
//赋值为. 这就表示已经走过这一边之后不可再走
board[row][column] = "."
let value = searchPath(row + 1, column, step + 1) || searchPath(row, column + 1, step + 1) || searchPath(row - 1, column, step + 1) || searchPath(row, column - 1, step + 1)
//还原之前赋值为.的数组值
board[row][column] = tmp
return value
} else {
return false
}
}
//1.遍历找矩阵起点
while (row < board.length) {
while (column < (board[0].length)) {
//找到起点
if (board[row][column] == word[0]) {
//如果找到了就返回
if(searchPath(row, column, 0)){
return true
}
}
column++
}
//column要重置为0才行
column = 0
row++
}
//找不到路径就返回false
return false
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )