leetcode wordSearch
z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class wordSearch {
/**
* Given a 2D board and a word, find if the word exists in the grid.
*
* The word can be constructed from letters of sequentially adjacent cell,
* where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
*
* Example:
*
* board =
* [
* ['A','B','C','E'],
* ['S','F','C','S'],
* ['A','D','E','E']
* ]
*
* Given word = "ABCCED", return true.
* Given word = "SEE", return true.
* Given word = "ABCB", return false.
*/
public boolean exist(char[][] board, String word) {
if (board == null || board[0].length == 0) return false;
int m = board.length;
int n = board[0].length;
boolean[][] visited = 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(word, board, visited, m, n, i, j, 0)) {
return true;
}
}
}
}
return false;
}

public boolean dfs(String word, char[][] board, boolean[][] visited, int m, int n, int i, int j, int index) {
if (i < 0 || j < 0 || i >= m || j>=n || visited[i][j] || board[i][j]!=word.charAt(index))
return false;
if (index == word.length()-1) return true;
visited[i][j] = true;

boolean ans = dfs(word, board, visited, m, n, i+1, j, index+1)
|| dfs(word, board, visited, m, n, i-1, j, index+1)
|| dfs(word, board, visited, m, n, i, j+1, index+1)
|| dfs(word, board, visited, m, n, i, j-1, index+1) ;
visited[i][j] = false;
return ans;
}
}