1
+ // 典型的回溯
2
+ // Runtime: 28 ms, faster than 75.07% of C++ online submissions for Word Search.
3
+ // Memory Usage: 12.5 MB, less than 52.94% of C++ online submissions for Word Search.
4
+
5
+ class Solution
6
+ {
7
+ public:
8
+ bool exist (vector<vector<char >>& matrix, string word)
9
+ {
10
+ // 边界条件处理
11
+ if (word.size () == 0 ) return false ;
12
+
13
+ int row = matrix.size ();
14
+ if (row == 0 ) return false ;
15
+
16
+ int col = matrix[0 ].size ();
17
+ if (col == 0 ) return false ;
18
+
19
+ // 循环查找
20
+ vector<vector<bool >> visited (row, vector<bool >(col, false ));
21
+ for (int i = 0 ; i < row; ++i)
22
+ {
23
+ for (int j = 0 ; j < col; ++j)
24
+ {
25
+ if (matrix[i][j] == word[0 ])
26
+ {
27
+ visited[i][j] = true ;
28
+
29
+ if (dfs (matrix, word, visited, i, j, 1 ))
30
+ return true ;
31
+
32
+ visited[i][j] = false ;
33
+ }
34
+ }
35
+ }
36
+ return false ;
37
+ }
38
+ private:
39
+ bool dfs (const vector<vector<char >>& matrix, const string& word, vector<vector<bool >>& visited, int starti, int startj, int start)
40
+ {
41
+ if (start == word.length ())
42
+ return true ;
43
+ else
44
+ {
45
+ // 向上寻找
46
+ if (starti - 1 >= 0 && !visited[starti - 1 ][startj] && matrix[starti - 1 ][startj] == word[start])
47
+ {
48
+ visited[starti - 1 ][startj] = true ;
49
+ if (dfs (matrix, word, visited, starti - 1 , startj, start + 1 ))
50
+ return true ;
51
+ visited[starti - 1 ][startj] = false ;
52
+ }
53
+
54
+ // 向下寻找
55
+ if (starti + 1 < matrix.size () && !visited[starti + 1 ][startj] && matrix[starti + 1 ][startj] == word[start])
56
+ {
57
+ visited[starti + 1 ][startj] = true ;
58
+ if (dfs (matrix, word, visited, starti + 1 , startj, start + 1 ))
59
+ return true ;
60
+ visited[starti + 1 ][startj] = false ;
61
+ }
62
+
63
+ // 向左寻找
64
+ if (startj - 1 >= 0 && !visited[starti][startj - 1 ] && matrix[starti][startj - 1 ] == word[start])
65
+ {
66
+ visited[starti][startj - 1 ] = true ;
67
+ if (dfs (matrix, word, visited, starti, startj - 1 , start + 1 ))
68
+ return true ;
69
+ visited[starti][startj - 1 ] = false ;
70
+ }
71
+
72
+ // 向右寻找
73
+ if (startj + 1 < matrix[0 ].size () && !visited[starti][startj + 1 ] && matrix[starti][startj + 1 ] == word[start])
74
+ {
75
+ visited[starti][startj + 1 ] = true ;
76
+ if (dfs (matrix, word, visited, starti, startj + 1 , start + 1 ))
77
+ return true ;
78
+ visited[starti][startj + 1 ] = false ;
79
+ }
80
+
81
+ return false ;
82
+ }
83
+ }
84
+ };
0 commit comments