递归参数:当前元素在矩阵中的行列索引i和j,当前目标字符在word中的索引k。
终止条件:
返回false:
(1)行或列索引越界
(2)当前矩阵元素与目标字符不同
(3)当前矩阵元素已访问过
返回 true: k = len(word) - 1 ,即字符串 word 已全部匹配。
递推工作:
标记当前矩阵元素: 将 board[i][j] 修改为空字符 '' ,代表此元素已访问过,防止之后搜索时重复访问。
搜索下一单元格:朝当前元素的 上、下、左、右 四个方向开启下层递归,使用或连接,并记录结果至res 。
还原当前矩阵元素:将board[i][j] 元素还原至初始值,即 word[k]。
返回值: 返回布尔量 res ,代表是否搜索到目标字符串。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix char字符型vector<vector<>> * @param word string字符串 * @return bool布尔型 */ bool hasPath(vector<vector<char>>& matrix, string word) { if(matrix.size()==0)return false; int row=matrix.size(),col=matrix[0].size(); for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ if(dfs(matrix,word,i,j,0)) return true; } } return false; } bool dfs(vector<vector<char>>&mat,string word,int i,int j,int k){ if(i<0||j<0||i>=mat.size()||j>=mat[0].size()||mat[i][j]!=word[k]) return false; if(k==word.size()-1) return true; mat[i][j]='\0'; bool flag=dfs(mat,word,i+1,j,k+1)||dfs(mat,word,i,j+1,k+1)||dfs(mat,word,i-1,j,k+1)||dfs(mat,word,i,j-1,k+1); mat[i][j]=word[k]; return flag; } };
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/solution/mian-shi-ti-12-ju-zhen-zhong-de-lu-jing-shen-du-yo/
来源:力扣(LeetCode)