65 矩阵中的路径
题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思路:拿到题目首先好好思考,看清楚接口,整体思路是每个点作为start点,然后调用另外的递归函数进行上下左右的寻找是否和目标字符串的当前字符相等。
首先matrix是一个一维指针,需要i * 列数 + j遍历得到每个数,然后就是递归基,要有返回正确的和错误的情况,字符串指针等于==nullptr是属于判断指针的情况,字符串的结尾是'\0';因为ij有加减操作,所以要判断是否大于rows,cols。
核心是回溯,因为传递给helper的是指针,当前元素如果访问了,就会被修改,修改的是原始数据,回溯法需要每次修改后回溯后之前的状态,所以要保存之前的状态,然后再递归之后修改回来。
class Solution { public: bool helper(char* matrix, int rows, int cols, char* str,int i,int j){ if(*str == '\0'){ return true; } if(i < 0 || j < 0 || i >= rows || j >= cols){ return false; } if(matrix[i * cols + j] != *str){ return false; } bool res = false; matrix[i * cols + j] = '@'; res = helper(matrix,rows,cols,str + 1,i - 1,j) || helper(matrix,rows,cols,str + 1,i + 1,j) || helper(matrix,rows,cols,str + 1,i,j - 1) || helper(matrix,rows,cols,str + 1,i,j + 1); matrix[i * cols + j] = *str; return res; } bool hasPath(char* matrix, int rows, int cols, char* str){ if(matrix == nullptr || rows <= 0 || cols <= 0 || str == nullptr){ return false; } bool res = false; for(int i = 0;i < rows;++i){ for(int j = 0;j < cols;++j){ if(matrix[i * cols + j] == *str){ res = helper(matrix,rows,cols,str,i,j); if(res == true){ return true; } } } } return res; } };