import java.util.*; public class Solution { /** * 遍历每个位置当起点试试 终止条件:到矩阵边界,下一个字符与该位置字符不符合 返回值:每条查询路径是否有这样的字符串,true,false 子问题:检查该位置字符与字符串中该字符是否相同,并向它四个相邻方向延申子问题。 将已经访问过的位置标记为&,避免重复访问。 * * @param matrix char字符型二维数组 * @param word string字符串 * @return bool布尔型 */ public boolean hasPath (char[][] matrix, String word) { // write code here //if(matrix.length==0||matrix[0].length==0) return false; //从每个起点进行递归 for(int i=0;i<matrix.length;i++){ for(int j=0;j<matrix[0].length;j++){ if(isPath(matrix,word,i,j,0))return true; } } return false; } //子函数,传参,字符串遍历的位置,矩阵位置,字符串,矩阵 public boolean isPath(char[][] matrix,String word,int i,int j,int index){ //终止条件:成功 if(index==word.length()){ return true; } //到边界 if(i<0||i>=matrix.length||j<0||j>=matrix[0].length) return false; //搜索过该位置也不行 if(matrix[i][j]=='&') return false; if(word.charAt(index)==matrix[i][j]){ //搜索附近四个方向查看是否匹配 char tmp = matrix[i][j]; matrix[i][j] ='&'; boolean res = isPath(matrix,word,i-1,j,index+1)|| isPath(matrix,word,i+1,j,index+1)|| isPath(matrix,word,i,j-1,index+1)|| isPath(matrix,word,i,j+1,index+1); //回溯,结束之后 matrix[i][j] = tmp; //返回结果 return res; } return false; } }