题目描述:
给定一个 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
限制:
1 <= board.length <= 200
1 <= board[i].length <= 200
board
和word
仅由大小写英文字母组成
实现代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>12.矩阵中的路径</title>
</head>
<body>
</body>
<script>
/**
* @param {character[][]} board
* @param {string} word
* @return {boolean}
*/
var exist = function(board, word) {
const row = board.length //矩阵行数
const col = board[0].length //矩阵列数
var dfs = (i,j,k) => { //k:字符串的第几个字符、
if( i >= row || j>= col || i<0 || j<0 || word[k] != board[i][j]){ //终止条件
return false
}
// 此时 word[k]必等于board[i][j],直接判断字符串是否已经遍历完就行
if( k === word.length-1 ) //如果已经判断到字符串的最后一位,表示所有字符串都已经找到
{
return true
}
board[i][j] = '#' //表示当前格子已经走过
const res= dfs(i+1,j,k+1) || dfs(i,j+1,k+1) || dfs(i-1,j,k+1) || dfs(i,j-1,k+1) // 只要其中一个为真,则返回真
board[i][j] = word[k]
return res
}
for(let i= 0; i<row; i++){
for(let j=0; j<col; j++){
if (dfs(i,j,0)){
return true
}
}
}
return false
};
exist([["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]],"ABCCED")
</script>
</html>