79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
提示:
board
和word
中只包含大写和小写英文字母。1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
思考:
深度优先搜索
class Solution {
//定义全局变量,省去递归传入每个方法参数的操作
int m, n;
char[][] board;
boolean[][] st;
String word;
public boolean exist(char[][] board, String word) {
this.board = board;
this.word = word;
m = board.length;
n = board[0].length;
st = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == word.charAt(0)) { //一旦第一个字符匹配
if (dfs(i, j, 1)) { //看看下一个字符
return true;
}
}
}
}
return false;
}
boolean dfs(int x, int y, int u) {
if (u == word.length()) return true;
st[x][y] = true; //标记该点走过,防止在重复走,导致死循环
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1}; //定义四个方向的常规做法
for (int i = 0; i < 4; i++) {
int a = x + dx[i], b = y + dy[i];
//满足三个条件: 1、当前的点首先满足条件 要和对应位置上的字符相等。
//2 下个点在边界内 3、下个点是没有走过的
if (a >= 0 && a < m && b >= 0 && b < n && board[a][b] == word.charAt(u)&&!st[a][b]) {
if (dfs(a, b, u + 1)) return true;
}
}
st[x][y] = false;//状态重置
return false;
}
}