思路:该题这是一个使用回溯算法解决的问题,涉及的知识点有 DFS 和状态重置,从给定的word的首字母出发,并从上下左右进行判断是否有符合的,如果有,则以下一个符合的作为起点,重复上次的操作,这样正是DFS的核心思想,而如果该点的下一个没有符合要求的结果,那么就设置该点未访问,这也就是状态重置
注意:在dfs的时候,如果已经找到一个正确的路径了,换句话说已经得到结果了,其实就没必要继续DFS了,直接返回结果即可。否则会报超出时间限制
class Solution {
//定义下右左上
int[] xx={1,0,0,-1};
int[] yy={0,1,-1,0};
int row;
int column;
boolean result = false;
boolean[][] isVisited;
public boolean exist(char[][] board, String word) {
//如果word为空直接返回
if (word==null){
return false;
}
//设置行和列的个数
row = board.length;
column = board[0].length;
//用于标记改点是否被访问
isVisited = new boolean[row][column];
//将words转换成char[]数组
char[] words = word.toCharArray();
for (int i=0;i<row;i++){
for (int j=0;j<column;j++){
//如果结果为true直接返回即可
if(result){
return true;
}
//遍历查找与word中第一个字母相同的作为起点
if (board[i][j]==words[0]){
dfs(board,words,i,j,1);
}
}
}
return result;
}
public void dfs(char[][] board, char[] words,int x,int y, int index) {
if (index>=words.length){
result = true;
return;
}
//如果找到了结果则不用继续遍历了
if(!result){
//先设置当前坐标已访问
isVisited[x][y]=true;
//一一遍历四个不同的方向
for (int i=0;i<4;i++){
int x1 = x + xx[i];
int y1 = y + yy[i];
//判断该点是否下标越界、该点是否访问过、以及改点的值是否与对要找的值相等
if (x1>=0&&x1<row&&y1>=0&&y1<column&&!isVisited[x1][y1]&&board[x1][y1]==words[index]){
dfs(board,words,x1,y1,index+1);
}
}
//该点的四个方向上都没有与之对应的值,那么就重新将该点设置未访问
isVisited[x][y]=false;
}
}
}