题目
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
思路:首先从矩阵的某一个位置开始找路径(默认从0,0开始),开始寻找之后,某一个字母都可以四个方向寻找,在寻找的时候我们要确定其边界,有如下四个:
1.边界问题,上下左右是否越界;越界返回false;
2.(为了防止遍历相同的位置,额外维护一个与board等大数组),visit数组是否访问过。访问过返回false;
3.矩阵当前的字符和匹配的当前字符是否相等,不等返回 false;
4.匹配的字符个数是否已经达到;
之后再进行四个方向额移动。
按照上面额逻辑,进行代码编写:
class Solution {
public boolean exist(char[][] board, String word) {
int h = board.length;//矩阵的行数
int w = board[0].length;//举证的列数
boolean[][] visit = new boolean[h][w];//维护访问的矩阵
for(int i=0;i<h;i++){
for(int j =0;j<w;j++){
boolean lag = dfs(board,visit,i,j,word,0);//默认先从第一个位置开始寻找,不符,从下一位置。也就是从任意位置出发,进行字符的匹配
if(lag){
return true;
}
}
}
return false;
}
public boolean dfs(char[][] board,boolean[][] visit,int i,int j,String s,int k){
//按照上面的四个条件进行编写
//1. 边界问题,上下左右是否越界;越界返回false;
if(i< 0 || i >= board.length || j< 0 || j>=board[0].length){
return false;
}
//2. visit数组是否访问过。访问过返回false;
if (visit[i][j]){
return false;
}
//3.矩阵当前的字符和匹配的当前字符是否相等,不等返回 false;
if(board[i][j]!=s.charAt(k)) return false;
//4.匹配的字符个数是否已经达到;
if(s.length()-1 == k){
return true;
}
visit[i][j] = true; //开始访问
//定义四个移动方向
int[] l = {0,1,-1,0};
int[] r = {1,0,0,-1};
for(int t=0;t<4;t++){
//判断是否符合寻找的路径,符合返回true
if(dfs(board,visit,i+l[t],j+r[t],s,k+1)) return true;
}
visit[i][j] = false;//每次回溯后 要将原来的位置复位。
return false;
}
}