"ABCESFCSADEE",3,4,"ABCCED"
true
"ABCESFCSADEE",3,4,"ABCB"
false
function hasPath(matrix, rows, cols, path) { if (path.length > matrix.length) return false; if (path.length == 0) return true; //将matrix化为数组 matrix = matrix.split(''); var bitArr = []; while (matrix.length > rows) { bitArr = matrix.splice(0, cols) matrix.push(bitArr); } //console.log(matrix); for (var i = 0; i < rows; i++) { var j = matrix[i].indexOf(path[0]); //一行之内可能有多个该字母 if (j == -1) continue; else for (var k = j; k < cols; k++) if (findChar(i, k, 0)) return true } return false; function findChar(i, j, index) { if (index == path.length) //已经超出path长度 return true; if (i < 0 || j < 0 || i == rows || j == cols ||matrix[i][j] == -1) //该值被用过,或者该值过界,则false //先判断是否过界 return false; if (matrix[i][j] != path[index]) return false; else (matrix[i][j] == path[index]) //当前位置的值 == path位置字符 { //console.log(matrix[i][j]) matrix[i][j] = -1; if (findChar(i+1, j, index+1) || findChar(i-1, j, index+1) || findChar(i, j+1, index+1) || findChar(i, j-1, index+1)) return true; else { matrix[i][j] = path[index]; return false; } } } }
function hasPath(matrix, rows, cols, path) { // write code here if(!matrix||!path.length||rows <= 0||cols <= 0||rows*cols <path.length){ return false } for(var i = 0;i < rows; i++){ for(var j = 0; j < cols;j++){ if(dfs(matrix,rows,cols,path,0,[],i,j)){ return true } } } return false } function dfs(matrix,rows,cols,path,k,flag,i,j){ var index = i*cols + j if(i < 0||j< 0||matrix[index] != path[k]||flag[index]===true||i >= rows || j >= cols){ return false } if(path.length-1 === k){ return true } flag[index] = true if(dfs(matrix,rows,cols,path,k+1,flag,i-1,j)|| dfs(matrix,rows,cols,path,k+1,flag,i+1,j)|| dfs(matrix,rows,cols,path,k+1,flag,i,j-1)|| dfs(matrix,rows,cols,path,k+1,flag,i,j+1) ){ return true } flag[index] = false return false }
function hasPath(matrix, rows, cols, path) { const flags = new Array(matrix.length).fill(0); for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { const index = i * cols + j; if (matrix[index] === path[0]) { // 为起点开始 if (hasPathCore(matrix, rows, cols, path, flags, i, j, 0)) return true; } } } return false; } function hasPathCore(matrix, rows, cols, path, flags, i, j, k) { let index = i * cols + j; if (i < 0 || j < 0 || i >= rows || j >= cols || flags[index] || path[k] !== matrix[index]) { return false; } if (path.length - 1 === k) { return true; } flags[index] = 1; if (hasPathCore(matrix, rows, cols, path, flags, i - 1, j, k + 1) || hasPathCore(matrix, rows, cols, path, flags, i + 1, j, k + 1) || hasPathCore(matrix, rows, cols, path, flags, i, j - 1, k + 1) || hasPathCore(matrix, rows, cols, path, flags, i, j + 1, k + 1) ) { return true; } flags[index] = 0; return false; }
function hasPath(matrix, rows, cols, path) { const flag = new Array(matrix.length).fill(false); for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { if (hasPathCore(matrix, i, j, rows, cols, path, flag, 0)) { return true; } } } return false; } function hasPathCore(matrix, i, j, rows, cols, path, flag, k) { const index = i * cols + j; if (i < 0 || j < 0 || i >= rows || j >= cols || matrix[index] != path[k] || flag[index]) { return false; } if (k === path.length - 1) { return true; } flag[index] = true; if (hasPathCore(matrix, i + 1, j, rows, cols, path, flag, k + 1) || hasPathCore(matrix, i - 1, j, rows, cols, path, flag, k + 1) || hasPathCore(matrix, i, j + 1, rows, cols, path, flag, k + 1) || hasPathCore(matrix, i, j - 1, rows, cols, path, flag, k + 1)) { return true; } flag[index] = false; return false; }
function hasPath(matrix, rows, cols, path)
{
// write code here
var parr=matrix.split('');
var y=[];
for(var i=0;i<rows;i++){
var yy=[];
for(var ii=0;ii<cols;ii++){
yy.push(parr.shift());
}
y.push(yy);
}
matrix=y;
function cp(arr){
var result=[];
for(var i=0;i<arr.length;i++){
let a=[...arr[i]];
result.push(a);
}
return result;
}
if(matrix.length===0||matrix[0].length===0)
return false;
var find=function(arr,patharr,x,y){
if(patharr.length===0)
return true;
if(x<0||y<0||x>arr.length-1||y>arr[0].length-1)
return false;
if(arr[x][y]!==patharr[0])
return false;
let copy=cp(arr);
copy[x][y]=0;
let copypath=[...patharr];
copypath.shift();
if(copypath.length===0)
return true;
if(find(copy,copypath,x-1,y))
return true;
if(find(copy,copypath,x+1,y))
return true;
if(find(copy,copypath,x,y-1))
return true;
if(find(copy,copypath,x,y+1))
return true;
return false;
}
for(var i=0;i<matrix.length;i++){
for(var ii=0;ii<matrix[0].length;ii++){
if(matrix[i][ii]==path[0]){
// console.log(i,ii);
if(find(matrix,path.split(''),i,ii)==true){
return true;
}
}
}
}
return false;
}
function hasPath(matrix, rows, cols, path)
{ // write code here var visit = new Array(rows), pathLength = 0; for(var i = 0; i < visit.length; i++){ visit[i] = Array(cols).fill(false); } function hasPathCore (row,col) { var isHasPath = false; if(pathLength === path.length - 1){ return true; } console.log(matrix[row * cols + col] === path[pathLength]); if(row >=0 && row < rows && col >=0 && col < cols && matrix[row * cols + col] === path[pathLength] && !visit[row][col]){ pathLength++; visit[row][col] = true; isHasPath = hasPathCore(row - 1,col) || hasPathCore(row + 1,col) || hasPathCore(row ,col + 1) || hasPathCore(row ,col - 1); if(!isHasPath){ visit[row][col]= false; pathLength--; } } return isHasPath; } for( i = 0; i < rows; i++){ for(var j = 0; j < cols; j++){ if(hasPathCore(i,j)){ return true; } } } return false; }
分析:回溯算法 这是一个可以用回朔法解决的典型题。首先,在矩阵中任选一个格子作为路径的起点。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的 第i个位置。如果路径上的第i个字符正好是ch,那么往相邻的格子寻找路径上的第i+1个字符。除在矩阵边界上的格子之外,其他格子都有4个相邻的格子。 重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。 由于回朔法的递归特性,路径可以被开成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个 字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。 由于路径不能重复进入矩阵的格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入每个格子。 当矩阵中坐标为(row,col)的 格子和路径字符串中相应的字符一样时,从4个相邻的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路径字符串中下一个字符 如果4个相邻的格子都没有匹配字符串中下一个的字符,表明当前路径字符串中字符在矩阵中的定位不正确,我们需要回到前一个,然后重新定位。 一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到合适的位置 class Solution { public: bool hasPath(char* matrix, int rows, int cols, char* str) { if(str==NULL||rows<=0||cols<=0) return false; bool *isOk=new bool[rows*cols](); for(int i=0;i<rows;i++) { for(int j=0;j<cols;j++) if(isHsaPath(matrix,rows,cols,str,isOk,i,j)) return true; } return false; } bool isHsaPath(char *matrix,int rows,int cols,char *str,bool *isOk,int curx,int cury) { if(*str=='\0') return true; if(cury==cols) { curx++; cury=0; } if(cury==-1) { curx--; cury=cols-1; } if(curx<0||curx>=rows) return false; if(isOk[curx*cols+cury]||*str!=matrix[curx*cols+cury]) return false; isOk[curx*cols+cury]=true; bool sign=isHsaPath(matrix,rows,cols,str+1,isOk,curx-1,cury) ||isHsaPath(matrix,rows,cols,str+1,isOk,curx+1,cury) ||isHsaPath(matrix,rows,cols,str+1,isOk,curx,cury-1) ||isHsaPath(matrix,rows,cols,str+1,isOk,curx,cury+1); isOk[curx*cols+cury]=false; return sign; } };