44
44
45
45
## 解法
46
46
47
- 深度优先搜索 DFS 解决。
47
+ ** 方法一:枚举 + DFS**
48
+
49
+ 我们可以枚举矩阵的每个位置 $(i, j)$,以该位置为起点,采用深度优先搜索的方法寻找字符串 ` word ` 的路径。如果找到了一条路径,即可返回 ` true ` ,否则在枚举完所有的位置后,返回 ` false ` 。
50
+
51
+ 那么问题的转换为如何采用深度优先搜索的方法寻找字符串 ` word ` 的路径。我们可以设计一个函数 $dfs(i, j, k)$,表示从位置 $(i, j)$ 开始,且当前将要匹配的字符为 ` word[k] ` 的情况下,是否能够找到字符串 ` word ` 的路径。如果能找到,返回 ` true ` ,否则返回 ` false ` 。
52
+
53
+ 函数 $dfs(i, j, k)$ 的执行流程如下:
54
+
55
+ - 如果当前字符 ` word[k] ` 已经匹配到字符串 ` word ` 的末尾,说明已经找到了字符串 ` word ` 的路径,返回 ` true ` 。
56
+ - 如果当前位置 $(i, j)$ 超出矩阵边界,或者当前位置的字符与 ` word[k] ` 不同,说明当前位置不在字符串 ` word ` 的路径上,返回 ` false ` 。
57
+ - 否则,我们将当前位置的字符标记为已访问(防止重复搜索),然后分别向当前位置的上、下、左、右四个方向继续匹配字符 ` word[k + 1] ` ,只要有一条路径能够匹配到字符串 ` word ` 的路径,就说明能够找到字符串 ` word ` 的路径,返回 ` true ` 。在回溯时,我们要将当前位置的字符还原为未访问过的状态。
58
+
59
+ 时间复杂度 $O(m \times n \times 3^k)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数,而 $k$ 为字符串 ` word ` 的长度。我们需要枚举矩阵中的每个位置,然后对于每个位置,我们最多需要搜索三个方向。
48
60
49
61
<!-- tabs:start -->
50
62
@@ -56,12 +68,11 @@ class Solution:
56
68
def dfs (i , j , k ):
57
69
if k == len (word):
58
70
return True
59
- if i < 0 or i >= m or j < 0 or j >= n or word[k] != board[i][j ]:
71
+ if i < 0 or i >= m or j < 0 or j >= n or board[i][j] != word[k ]:
60
72
return False
61
- board[i][j] = ' '
62
- ans = any (
63
- dfs(i + a, j + b, k + 1 ) for a, b in [[0 , - 1 ], [0 , 1 ], [1 , 0 ], [- 1 , 0 ]]
64
- )
73
+ board[i][j] = " "
74
+ dirs = (- 1 , 0 , 1 , 0 , - 1 )
75
+ ans = any (dfs(i + a, j + b, k + 1 ) for a, b in pairwise(dirs))
65
76
board[i][j] = word[k]
66
77
return ans
67
78
@@ -112,41 +123,38 @@ class Solution {
112
123
}
113
124
```
114
125
115
- ### ** JavaScript **
126
+ ### ** C++ **
116
127
117
- ``` js
118
- /**
119
- * @param {character[][]} board
120
- * @param {string} word
121
- * @return {boolean}
122
- */
123
- var exist = function (board , word ) {
124
- const m = board .length ;
125
- const n = board[0 ].length ;
126
- let dfs = function (i , j , k ) {
127
- if (k == word .length ) {
128
- return true ;
129
- }
130
- if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[k]) {
131
- return false ;
132
- }
133
- board[i][j] = ' ' ;
134
- let ans = false ;
135
- let dirs = [- 1 , 0 , 1 , 0 , - 1 ];
136
- for (let l = 0 ; l < 4 ; ++ l) {
137
- ans = ans || dfs (i + dirs[l], j + dirs[l + 1 ], k + 1 );
138
- }
139
- board[i][j] = word[k];
140
- return ans;
141
- };
142
- for (let i = 0 ; i < m; ++ i) {
143
- for (let j = 0 ; j < n; ++ j) {
144
- if (dfs (i, j, 0 )) {
128
+ ``` cpp
129
+ class Solution {
130
+ public:
131
+ bool exist(vector<vector<char >>& board, string word) {
132
+ int m = board.size(), n = board[ 0] .size();
133
+ int dirs[ 5] = {-1, 0, 1, 0, -1};
134
+ function<bool(int, int, int)> dfs = [ &] (int i, int j, int k) -> bool {
135
+ if (k == word.size()) {
145
136
return true;
146
137
}
138
+ if (i < 0 || i >= m || j < 0 || j >= n || board[ i] [ j ] != word[ k] ) {
139
+ return false;
140
+ }
141
+ board[ i] [ j ] = '.';
142
+ bool ans = 0;
143
+ for (int l = 0; l < 4; ++l) {
144
+ ans |= dfs(i + dirs[ l] , j + dirs[ l + 1] , k + 1);
145
+ }
146
+ board[ i] [ j ] = word[ k] ;
147
+ return ans;
148
+ };
149
+ for (int i = 0; i < m; ++i) {
150
+ for (int j = 0; j < n; ++j) {
151
+ if (dfs(i, j, 0)) {
152
+ return true;
153
+ }
154
+ }
147
155
}
156
+ return false;
148
157
}
149
- return false ;
150
158
};
151
159
```
152
160
@@ -183,30 +191,41 @@ func exist(board [][]byte, word string) bool {
183
191
}
184
192
```
185
193
186
- ### ** C++**
187
-
188
- ``` cpp
189
- class Solution {
190
- public:
191
- bool exist(vector<vector<char >>& board, string word) {
192
- for (int i = 0; i < board.size(); ++i)
193
- for (int j = 0; j < board[ 0] .size(); ++j)
194
- if (dfs(i, j, 0, board, word))
195
- return 1;
196
- return 0;
197
- }
194
+ ### ** JavaScript**
198
195
199
- bool dfs(int i, int j, int k, vector<vector<char>>& board, string word) {
200
- if (k == word.size()) return 1;
201
- if (i < 0 || i >= board.size() || j < 0 || j >= board[0].size() || board[i][j] != word[k]) return 0;
202
- vector<int> dirs = {-1, 0, 1, 0, -1};
196
+ ``` js
197
+ /**
198
+ * @param {character[][]} board
199
+ * @param {string} word
200
+ * @return {boolean}
201
+ */
202
+ var exist = function (board , word ) {
203
+ const m = board .length ;
204
+ const n = board[0 ].length ;
205
+ const dirs = [- 1 , 0 , 1 , 0 , - 1 ];
206
+ const dfs = (i , j , k ) => {
207
+ if (k == word .length ) {
208
+ return true ;
209
+ }
210
+ if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[k]) {
211
+ return false ;
212
+ }
203
213
board[i][j] = ' ' ;
204
- bool ans = 0;
205
- for (int l = 0; l < 4; ++l)
206
- ans = ans || dfs(i + dirs[l], j + dirs[l + 1], k + 1, board, word);
214
+ let ans = false ;
215
+ for (let l = 0 ; l < 4 ; ++ l) {
216
+ ans = ans || dfs (i + dirs[l], j + dirs[l + 1 ], k + 1 );
217
+ }
207
218
board[i][j] = word[k];
208
219
return ans;
220
+ };
221
+ for (let i = 0 ; i < m; ++ i) {
222
+ for (let j = 0 ; j < n; ++ j) {
223
+ if (dfs (i, j, 0 )) {
224
+ return true ;
225
+ }
226
+ }
209
227
}
228
+ return false ;
210
229
};
211
230
```
212
231
@@ -292,32 +311,41 @@ impl Solution {
292
311
293
312
``` cs
294
313
public class Solution {
314
+ private char [][] board ;
315
+ private string word ;
316
+ private int m ;
317
+ private int n ;
318
+
295
319
public bool Exist (char [][] board , string word ) {
296
- int k = 0 ;
297
- for (int i = 0 ; i < board .Length ; i ++ )
298
- {
299
- for (int j = 0 ; j < board [0 ].Length ; j ++ )
300
- {
301
- if (dfs (board , word , i , j , k )) {
320
+ m = board .Length ;
321
+ n = board [0 ].Length ;
322
+ this .board = board ;
323
+ this .word = word ;
324
+ for (int i = 0 ; i < m ; ++ i ) {
325
+ for (int j = 0 ; j < n ; ++ j ) {
326
+ if (dfs (i , j , 0 )) {
302
327
return true ;
303
328
}
304
329
}
305
330
}
306
331
return false ;
307
332
}
308
333
309
- public bool dfs (char [][] board , string word , int i , int j , int k ) {
310
- if (i > board .Length - 1 || i < 0 || j > board [0 ].Length - 1 || j < 0 || board [i ][j ] != word [k ]) {
334
+ private bool dfs (int i , int j , int k ) {
335
+ if (k == word .Length ) {
336
+ return true ;
337
+ }
338
+ if (i < 0 || i >= m || j < 0 || j >= n || word [k ] != board [i ][j ]) {
311
339
return false ;
312
340
}
313
- if (k == word .Length - 1 ) {
314
- return true ;
341
+ board [i ][j ] = ' ' ;
342
+ int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
343
+ bool ans = false ;
344
+ for (int l = 0 ; l < 4 ; ++ l ) {
345
+ ans = ans || dfs (i + dirs [l ], j + dirs [l + 1 ], k + 1 );
315
346
}
316
-
317
- board [i ][j ] = '\0 ' ;
318
- bool res = dfs (board , word , i + 1 , j , k + 1 ) || dfs (board , word , i , j + 1 , k + 1 ) || dfs (board , word , i - 1 , j , k + 1 ) || dfs (board , word , i , j - 1 , k + 1 );
319
347
board [i ][j ] = word [k ];
320
- return res ;
348
+ return ans ;
321
349
}
322
350
}
323
351
```
0 commit comments