class Solution { /** * @param String[][] $board * @param String $word * @return Boolean */ function exist($board, $word) { $x = count($board); $y = count($board[0]); $row = array_fill(0, $x, 0); $visited = array_fill(0, $y, $row); for ($i = 0; $i < $x; $i++) { for ($j = 0; $j < $y; $j++) { if ($this->dfs($board, $visited, $word, $i, $j, 0)) { return true; } } } return false; } function dfs($board, $visited, $word, $x, $y, $index) { // 如果值不相等则当前分支不符合 不再往下搜索 if ($board[$x][$y] != $word[$index]) { return false; } // 如果是最后一个字符 不用往下搜索 if (strlen($word) - 1 == $index) { return true; } //从 4 个方向搜索剩余结果 搜索过的不搜索 (通过 visited 实现) $visited[$x][$y] = 1; //进入那一层直接标记 //向左搜索 如果未被访问过 if ($x > 0 && !$visited[$x - 1][$y]) { //如果左分支搜到剩余结果 不在继续搜索 if ($this->dfs($board, $visited, $word, $x - 1, $y, $index + 1)) { return true; } } //向右搜索 如果未被访问过 if ($x < count($board) && !$visited[$x + 1][$y]) { //如果右分支搜索剩余结果 不在继续搜索 if ($this->dfs($board, $visited, $word, $x + 1, $y, $index + 1)) { return true; } } //向上 if ($y > 0 && !$visited[$x][$y - 1]) { if ($this->dfs($board, $visited, $word, $x, $y - 1, $index + 1)) { return true; } } //向下 if ($y < count($board[0]) && !$visited[$x][$y + 1]) { if ($this->dfs($board, $visited, $word, $x, $y + 1, $index + 1)) { return true; } } //如果 4 个方向均未搜索到剩余结果 那么对于$board[$x][$y]这个点结果就是不存在 //$visited[$x][$y] = 0; //恢复这个点未被访问 由于是副本这里不写 结果也没错 return false; } }
copy success
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67