固定解法dfs


Word Search
这题没有一次AC的原因在于,过早的修改了visited数组,导致没法undo 这个数组。

首先, 开一个哈希集合,来记录word的prefix。在搜索过程中,如果构成的string不是word的一个prefix,直接返回false。
在做DFS的过程中,我们得有一个visited的数组,表示当前搜索路径中该点是否被访问过,如果访问过,返回。

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
HashSet<String> set = new HashSet<String>();

public boolean (char[][] board, String word) {
for (int i = 0; i < word.length(); ++i) {
set.add(word.substring(0, i + 1));
}
for (int i = 0; i < board.length; ++i) {
for (int j = 0; j < board[0].length; ++j) {
if (board[i][j] == word.charAt(0)) {
boolean[][] visited = new boolean[board.length][board[0].length];
if (dfs(board, "", i, j, visited , word))
return true;
}
}
}
return false;
}

public boolean dfs(char[][] board, String path, int i, int j, boolean[][] visited, String target) {
if (i < 0 || j < 0 || i >= board.length || j >= board[0].length)
return false;
if (visited[i][j])
return false;
path += board[i][j];
if (set.contains(path) == false)
return false;
if (path.equals(target))
return true;

visited[i][j] = true;
if (dfs(board, path, i + 1, j, visited, target)
|| dfs(board, path, i - 1, j, visited, target)
|| dfs(board, path, i, j + 1, visited, target)
|| dfs(board, path, i, j - 1, visited, target))
return true;
visited[i][j] = false;
return false;
}