题目大意
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
一、示意图
二、解题思路
DFS
DFS
代码如下:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
//是不是需要设置一个 用来判断某个位置有没有访问过的呢
private boolean [][]visited;
//然后就是 方位
private int x[]={0,0,1,-1};
private int y[]={1,-1,0,0};
//然后是一个结果吗
boolean valid;
public boolean hasPath (char[][] matrix, String word) {
// write code here
//要输出 一条包含某字符串所有字符的路径 那肯定是需要从word中的第一个字符还是找
//找matrix中对应的第一个字符 但是可能存在多个第一个字符
//开始初始化
//默认都是false
visited=new boolean[matrix.length][matrix[0].length];
valid=false;
//然后开始遍历 找到第一个等于word的值
int index=0;
char[] chars = word.toCharArray();
//不知道这样好不好
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
//找到那些第一个值
//这里index是不是要初始化呢
index=0;
if(matrix[i][j]==chars[index]&&!visited[i][j]){
//说明还没有被访问过 并且这个值是一样的 那就开始遍历
//还是要在这个地方进行 访问过的判断呢
//visited[i][j]=true;
dfs(i,j,chars,index,matrix);
}
}
}
return valid;
}
private void dfs(int i, int j, char[] chars, int index, char[][] matrix) {
//那就是说明 i j符合char的第一个index 当index等于最后一个的时候 那就可以跳出循环了吧
//先进行一些初始化
//这里再进一步
index++;
//然后把这个点当作访问过了
visited[i][j]=true;
if(index==chars.length){
//说明已经到了结束的
valid=true;
return;
}
//不然的话 就需要开始遍历了
for(int step=0;step<4;step++){
//遍历他的四周 并且是不能越界的
int newi=i+x[step];
int newj=j+y[step];
//然后进行判断 先进行越界判断
if(newi>=0&&newi<matrix.length&&newj>=0&&newj<matrix[0].length&&!visited[newi][newj]&&matrix[newi][newj]==chars[index]){
//如果满足条件的话 那就继续递归
dfs(newi,newj,chars,index,matrix);
}
}
//是不是这里就需要还原回去呢
visited[i][j]=false;
}
}