请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意:
矩阵中元素的总个数 [0,900]。
路径字符串的总长度 [0,900]。
matrix= [ ["A","B","C","E"], ["S","F","C","S"], ["A","D","E","E"] ] str="BCCE" , return "true" str="ASAE" , return "false"
1 class Solution { 2 public: 3 static constexpr int g_direction[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 上、右、下、左四个方向 4 bool hasPathHelper(const vector<vector<char>> &matrix, int x, int y, 5 const string &str, int &pathLength, vector<vector<bool>> &visited) { 6 // DFS出口:字符串全部匹配完 7 if (str[pathLength] == '\0') { 8 return true; 9 } 10 int row = matrix.size(); 11 int cow = matrix[0].size(); 12 bool hasPath = false; 13 // 1、元素在范围内;2、待匹配元素与字符串中字符匹配;3、元素未被访问过 14 if ((x >= 0 && x < row) && (y >= 0 && y < cow) && (matrix[x][y] == str[pathLength]) && !visited[x][y]) { 15 visited[x][y] = true; 16 pathLength++; 17 for (int i = 0; i < 4; i++) { 18 int xNext = x + g_direction[i][0]; 19 int yNext = y + g_direction[i][1]; 20 if (hasPathHelper(matrix, xNext, yNext, str, pathLength, visited)) { 21 hasPath = true; 22 break; 23 } 24 } 25 // 回溯 26 if (!hasPath) { 27 visited[x][y] = false; 28 pathLength--; 29 } 30 } 31 return hasPath; 32 } 33 bool hasPath(vector<vector<char>>& matrix, string &str) { 34 if (matrix.size() == 0 || matrix[0].size() == 0 || str.empty()) { 35 return false; 36 } 37 int row = matrix.size(); 38 int cow = matrix[0].size(); 39 vector<vector<bool>> visited(row, vector<bool>(cow, false)); // 标记元素是否被访问过 40 int pathLength = 0; // 字符串中匹配的字符索引 41 for (int i = 0; i < row; i++) { 42 for (int j = 0; j < cow; j++) { 43 if (hasPathHelper(matrix, i, j, str, pathLength, visited)) { 44 return true; 45 } 46 } 47 } 48 return false; 49 } 50 };