算法1
回溯法
创建一个辅助数组来确定每个位置是否是字符串中的字符,如果是,则为true,如果不是,则为false,初始数组都为false;
创建一个变量来储存当前路径的长度,当长度和字符串一样时,说明已经完成了,直接返回true;
先遍历矩阵,找到和字符串第一个字符相同的字符,作为路径的开始;
然后进入函数,进行合法性判断以及当前路径的字符和字符串上对应位置的字符是否相等,不相等,直接返回false;如果相等,则矩阵路径+1,并将当前位置置为true,然后对当前位置的上下左右四个位置进行遍历,找寻路径的下一个位置,如果四个位置都没有找到,则返回false,并将当前位置重新改为false,然后路径-1,因为当前位置不是正确的路径,因为路径-1,所以回到上一位置,重新寻找。
java 代码
class Solution {
public boolean hasPath(char[][] matrix, String str) {
if(matrix == null||str==null){
return false;}
int rows = matrix.length;
if(rows==0)return false;
int cols = matrix[0].length;
int pathLength = 0;
boolean[][] visited = new boolean[rows][cols];
for(int i=0;i<rows;i++){
for(int j = 0;j<cols;j++){
if(hasPathCore(matrix,rows,cols,i,j,str,pathLength,visited))
return true;
}
}
return false;
}
public boolean hasPathCore(char[][] matrix,int rows, int cols,int row, int col,
String str,int pathLength, boolean[][] visited){
boolean flag = false;
if(row>=0&&row<rows&&col>=0&&col<cols&&!visited[row][col]&&matrix[row][col]==str.charAt(pathLength)){
pathLength++;
visited[row][col]=true;
if(pathLength==str.length())
return true;
flag = hasPathCore(matrix, rows, cols, row+1, col, str, pathLength, visited)||
hasPathCore(matrix, rows, cols, row, col+1, str, pathLength, visited)||
hasPathCore(matrix, rows, cols, row-1, col, str, pathLength, visited)||
hasPathCore(matrix, rows, cols, row, col-1, str, pathLength, visited);
if(!flag){
pathLength--;
visited[row][col]=false;
}
}
return flag;
}
}
你这个 好像有1个问题,出在visited【】【】数组这里,如果某个元素坐标 对应的 visited【】【】被置成false,但是!visited[row][col] 判断为true,依然继续执行,这样不满足每一个格子只走一遍的要求。