1
+ /**
2
+ * @param {character[][] } board
3
+ * @param {string } word
4
+ * @return {boolean }
5
+ */
6
+ let directions = [ [ - 1 , 0 ] , [ 1 , 0 ] , [ 0 , - 1 ] , [ 0 , 1 ] ] // 左 右 上 下
7
+
8
+ let exist = function ( board , word ) {
9
+ let maxY = board . length
10
+ if ( ! maxY ) return false
11
+ let maxX = board [ 0 ] . length
12
+
13
+ // 二维数组记录已访问过的元素
14
+ let visited = new Array ( maxY )
15
+ for ( let y = 0 ; y < visited . length ; y ++ ) {
16
+ visited [ y ] = new Array ( maxX )
17
+ }
18
+
19
+ let inArea = ( x , y ) => {
20
+ return x >= 0 && x < maxX && y >= 0 && y < maxY
21
+ }
22
+
23
+ let search = ( startX , startY , wordIndex ) => {
24
+ // 当前起始字符不匹配 直接失败
25
+ let curCell = board [ startY ] [ startX ]
26
+ let curChar = word [ wordIndex ]
27
+ if ( curCell !== curChar ) {
28
+ return false
29
+ }
30
+
31
+ // 如果递归到最后一位字符 就直接返回最后一位字符是否匹配成功
32
+ if ( wordIndex === word . length - 1 ) {
33
+ return curChar === curChar
34
+ }
35
+
36
+ // 进一步递归 先记录为已访问元素 防止递归的时候重复访问
37
+ visited [ startY ] [ startX ] = true
38
+
39
+ for ( let direction of directions ) {
40
+ let [ x , y ] = direction
41
+ let nextX = startX + x
42
+ let nextY = startY + y
43
+
44
+ // 需要保证未越界且未被访问过
45
+ if ( inArea ( nextX , nextY ) && ! visited [ nextY ] [ nextX ] ) {
46
+ if ( search ( nextX , nextY , wordIndex + 1 ) ) {
47
+ return true
48
+ }
49
+ }
50
+ }
51
+ // 重置已访问标记位
52
+ visited [ startY ] [ startX ] = false
53
+ }
54
+
55
+ for ( let y = 0 ; y < maxY ; y ++ ) {
56
+ for ( let x = 0 ; x < maxX ; x ++ ) {
57
+ if ( search ( x , y , 0 ) ) {
58
+ return true
59
+ }
60
+ }
61
+ }
62
+
63
+ return false
64
+ } ;
0 commit comments