1+ /**
2+ * @param {character[][] } board
3+ * @param {string[] } words
4+ * @return {string[] }
5+ */
6+ // Trie 数据结构实现
7+ var TrieNode = function ( ) {
8+ this . next = { }
9+ this . isEnd = false
10+ }
11+ var Trie = function ( ) {
12+ this . root = new TrieNode ( )
13+ }
14+ Trie . prototype . insert = function ( word ) {
15+ if ( ! word ) {
16+ return false
17+ }
18+ let node = this . root
19+ for ( let i = 0 ; i < word . length ; i ++ ) {
20+ if ( ! node . next [ word [ i ] ] ) {
21+ node . next [ word [ i ] ] = new TrieNode ( )
22+ }
23+ node = node . next [ word [ i ] ]
24+ }
25+ node . isEnd = true
26+ return true
27+ }
28+ Trie . prototype . search = function ( word ) {
29+ if ( ! word ) {
30+ return false
31+ }
32+ let node = this . root
33+ for ( let i = 0 ; i < word . length ; i ++ ) {
34+ if ( node . next [ word [ i ] ] ) {
35+ node = node . next [ word [ i ] ]
36+ } else {
37+ return false
38+ }
39+ }
40+ return node . isEnd
41+ }
42+ Trie . prototype . searchPrefix = function ( prefix ) {
43+ if ( ! prefix ) {
44+ return false
45+ }
46+ let node = this . root
47+ for ( let i = 0 ; i < prefix . length ; i ++ ) {
48+ if ( node . next [ prefix [ i ] ] ) {
49+ node = node . next [ prefix [ i ] ]
50+ } else {
51+ return false
52+ }
53+ }
54+ return true
55+ }
56+
57+
58+ var findWords = function ( board , words ) {
59+ var trie = new Trie ( )
60+ // 初始化Trie树
61+ for ( let i = 0 ; i < words . length ; i ++ ) {
62+ trie . insert ( words [ i ] )
63+ }
64+ // 初始化变量
65+ const [ m , n ] = [ board . length , board [ 0 ] . length ]
66+ // 四联通
67+ const dx = [ - 1 , 1 , 0 , 0 ]
68+ const dy = [ 0 , 0 , - 1 , 1 ]
69+ const res = [ ]
70+ var dfs = ( i , j , curStr ) => {
71+ const restore = board [ i ] [ j ]
72+ curStr += restore
73+
74+ if ( trie . search ( curStr ) && res . indexOf ( curStr ) === - 1 ) {
75+ res . push ( curStr )
76+ }
77+ if ( ! trie . searchPrefix ( curStr ) ) {
78+ return
79+ }
80+
81+ board [ i ] [ j ] = '@'
82+ for ( let k = 0 ; k < 4 ; k ++ ) {
83+ const [ x , y ] = [ i + dx [ k ] , j + dy [ k ] ]
84+ if ( x >= 0 && x < m && y >= 0 && y < n && board [ x ] [ y ] !== '@' ) {
85+ dfs ( x , y , curStr )
86+ }
87+ }
88+ board [ i ] [ j ] = restore
89+ }
90+
91+ for ( let i = 0 ; i < m ; i ++ ) {
92+ for ( let j = 0 ; j < n ; j ++ ) {
93+ dfs ( i , j , '' )
94+ }
95+ }
96+ return res
97+ } ;
0 commit comments