仅供自己记录刷题情况
剑指Offer 12.矩阵中的路径(JS)
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。
[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]
但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码解答
/**
* @param {character[][]} board
* @param {string} word
* @return {boolean}
*/
var exist = function(board, word) {
//递归函数dfs
let dfs = function(row,col,num){
//判断寻找过程是否进行到了最后(是否定位到了最后一个目标元素)
if(num >= word.length){
return true;
}
//判断矩阵的上下左右 下标是否越界
if(row < 0 || col < 0 || row>board.length-1 || col > board[0].length -1 ){
return false;
}
//判断矩阵中当前定位的元素是否为目标元素 以及此元素是否已经被判断过了(此判断可和上面的判断写在一起的)
if(board[row][col] !== word[num] || board[row][col] === ''){
return false;
}
//定义一个中间变量存储当前元素 并设置当前元素的状态为已经访问
let temp = board[row][col];
board[row][col] = '';
//对当前元素位置的上下左右进行检索,找出word下一目标元素
let next = dfs(row-1,col,num+1) || dfs(row,col-1,num+1) || dfs(row+1,col,num+1) || dfs(row,col+1,num+1)
//还原当前元素(因为上面设置了当前元素为'',可能在下一次的递归中,此元素还能被上下左右的访问到,所以要保证他的值还是原来的值)
board[row][col]=temp;
return next;
}
//开始矩阵查找
for(let i = 0;i<board.length;i++){
for(let j = 0;j<board[0].length;j++){
if(dfs(i,j,0)){
return true;
}
}
}
/*注意
输入: [["a"]] "ab"
这样的数据时,就会返回false;
*/
return false;
};