一、题目
请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
数据范围:0<=n,m<=20,1<=len<=25
二、题解
采用回溯法来解决。
回溯算法实际上一个类似枚举的搜索尝试过程,也就是一个个去试,我们解这道题也是通过一个个去试。
从矩形中的一个点开始往它的上下左右四个方向查找,遍历矩形所有的点。由于是二维数组,所有有两个for循环。
public boolean hasPath(char[][] matrix,String word){
char[] words = word.toCharArray();
for(int i = 0;i < matrix.length;i++){
for(int j = 0; j < matrix[0].length;j++){
if(dfs(matrix,words,i,j,0))
return true;
}
}
return false;
}
boolean dfs(char[][] matrix,char[] word,int i,int j,int index){
if(i >= matrix.length || i < 0 || j >= matrix[0].length || j < 0 || matrix[i][j] != word[index])
return false;
if(index == word.length -1)
return true;
char temp = matrix[i][j];
matrix[i][j] = '.';
boolean res = dfs(matrix,word,i+1,j,index + 1)
|| dfs(matrix,word,i-1,j,index+1)
|| dfs(matrix,word,i,j+1,index+1)
|| dfs(matrix,word,i,j-1,index+1);
matrix[i][j] = temp;
return res;
}