题目
请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
数据范围:0 \le n,m \le 20\0≤n,m≤20 ,1\le len \le 25\1≤len≤25
代码
import java.util.*;
//回溯法 深度优先
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param matrix char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
public boolean hasPath (char[][] matrix, String word) {
// write code here
//首先我们需要遍历矩形的所有点,二维数组
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
//如果深度优先遍历后找到,返回true,否则到最后都没找到false
//martix数组,word字符串,0已经找到word的第几个字符
//i,j位置,从[i , j]开始查找
if(dfs(matrix ,word , 0 , i , j)){
return true;
}//if
}//for j
}//for i
return false;
}
//矩阵查找的深度优先算法
/**index代表已经查找到word的第几个字符
*/
boolean dfs(char[][] matrix , String word , int index , int x , int y){
//首先进行边界判断,越界返回false
//如果对应位置的字符不等于matrix[i][j],则此路径不通返回false
//先判断边界,再比较相等。
if(x >= matrix.length || x < 0 || y >= matrix[0].length || y < 0
|| matrix[x][y] != word.charAt(index)){
return false;
}//if
//如果word中每个字符都查找结束,返回true
if(index == word.length() -1){
return true;
}
//回溯 + 深度优先
//将当前的坐标的值保存下来(为了还原)
char temp = matrix[x][y];
//修改当前坐标的值,标记,防止重复
matrix[x][y] = '*';
//递归,沿着当前位置坐标的上下左右四个方向查找
boolean res = dfs(matrix , word , index + 1 , x , y - 1)
|| dfs(matrix , word , index + 1 , x , y + 1)
|| dfs(matrix , word , index + 1 , x - 1 , y)
|| dfs(matrix , word , index + 1 , x + 1 , y);
//递归结束后还原当前坐标
matrix[x][y] = temp;
return res;
}
}