请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
数据范围:
,
[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"
true
[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcb"
false
0 <= matrix.length <= 2000 <= matrix[i].length <= 200
function hasPath( matrix , word ) {
let m = matrix.length,n = matrix[0].length;
function dfs(i,j,k=0){ // 第k个字符
if(i<0 || i>=m || j<0 || j>=n||word[k]!==matrix[i][j] || matrix[i][j]===0) return false;
if(k === word.length-1) return true;
let temp = matrix[i][j];
matrix[i][j] = 0;
if(dfs(i,j+1,k+1) || dfs(i,j-1,k+1) || dfs(i-1,j,k+1) || dfs(i+1,j,k+1)){
return true;
}
matrix[i][j] = temp;
return false;
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(dfs(i,j,0)){
return true;
}
}
}
return false;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
function hasPath( matrix , word ) {
// write code here
let rows = matrix.length;
let cols = matrix[0].length;
let flag = new Array((rows-1)*(cols-1)).fill(null);
for(let i=0;i<rows;i++){
for(let j=0;j<cols;j++){
//循环遍历二维数组,找到七点啊等于word第一个元素的值,再递归判断四周是否有符合条件的第二个值
if(judge(matrix,i,j,rows,cols,flag,word,0)){
return true;
}
}
}
return false;
}
function judge(matrix,i,j,rows,cols,flag,word,k){
//根据i和j计算匹配的第一个元素转为一维数组的未知
let index=i*cols+j;
//递归终止条件
if(i<0||j<0||i>=rows||j>=cols||matrix[i][j]!=word[k]||flag[index]==true){
return false;
}
//k的初始值为0,若k已经到达word末尾了,说明都已经匹配成功了,直接返回true
if(k==word.length-1){
return true
}
//要走的第一个位置为true,表示已经走过了
flag[index]=true;
//回溯,递归寻找 每次找到给k加1,找不到就还原
if(judge(matrix,i-1,j,rows,cols,flag,word,k+1)||
judge(matrix,i+1,j,rows,cols,flag,word,k+1)||
judge(matrix,i,j-1,rows,cols,flag,word,k+1)||
judge(matrix,i,j+1,rows,cols,flag,word,k+1)){
return true
}
//走到这,说明这一条路不通,还原尝试其他路径
flag[index]=false;
return false;
}
module.exports = {
hasPath : hasPath
};