题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
深搜,回溯
用一个pathlength标记走的长度,也是为了指向str匹配到哪一个字符了
然后如果走到死胡同,即下面几个方向都没戏,那么pathlength--,取消刚才点的访问
class Solution { public: bool hasPath(char *matrix, int rows, int cols, char *str) { if (!matrix || rows < 1 && cols < 1 && !str) return false; //访问标记 bool *visited = new bool[rows * cols]; memset(visited, 0, rows * cols); int pathlength = 0; //路径长度 标记匹配到str的第几个字符 回溯用 for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if(matrix[i*cols+j]==*str){//找到可以开始的头 if (dfs(matrix, rows, cols, i, j, str, pathlength, visited)) return true; } } } delete[] visited; return false; } bool dfs(char *matrix, int rows, int cols, int i, int j, char *str, int &pathlength, bool *visited) { if (str[pathlength] == '\0') return true; bool haspath = false; //坐标合法 当前字符匹配 并且未访问过 if (i >= 0 && i < rows && j >= 0 && j < cols && matrix[i * cols + j] == str[pathlength] && !visited[i * cols + j]) { pathlength++; visited[i * cols + j] = true; haspath = dfs(matrix, rows, cols, i - 1, j, str, pathlength, visited) || dfs(matrix, rows, cols, i + 1, j, str, pathlength, visited) || dfs(matrix, rows, cols, i, j - 1, str, pathlength, visited) || dfs(matrix, rows, cols, i, j + 1, str, pathlength, visited); if (!haspath) { //四个方向都没有 回溯 取消访问标记 pathlength--; visited[i * cols + j] = false; } } return haspath; } };