9
9
*/
10
10
11
11
class WordSearchII {
12
- func findWords( board: [ [ Character ] ] , _ words: [ String ] ) -> [ String ] {
12
+
13
+ func findWords( _ board: [ [ Character ] ] , _ words: [ String ] ) -> [ String ] {
13
14
var res = [ String] ( )
14
15
15
16
let m = board. count
16
17
let n = board [ 0 ] . count
17
18
18
19
let trie = _convertToTrie ( words)
19
- var visited = [ [ Bool] ] ( count : m , repeatedValue : Array ( count: n, repeatedValue : false ) )
20
+ var visited = [ [ Bool] ] ( repeating : Array ( repeating : false , count: n) , count : m )
20
21
21
- for i in 0 ..< m {
22
- for j in 0 ..< n {
22
+ for i in 0 ..< m {
23
+ for j in 0 ..< n {
23
24
_dfs ( board, m, n, i, j, & visited, & res, trie, " " )
24
25
}
25
26
}
26
27
27
28
return res
28
29
}
29
30
30
- private func _dfs( board: [ [ Character ] ] , _ m: Int , _ n: Int , _ i: Int , _ j: Int , inout _ visited: [ [ Bool ] ] , inout _ res: [ String ] , _ trie: Trie , _ str: String ) {
31
+ fileprivate func _dfs( _ board: [ [ Character ] ] , _ m: Int , _ n: Int , _ i: Int , _ j: Int , _ visited: inout [ [ Bool ] ] , _ res: inout [ String ] , _ trie: Trie , _ str: String ) {
31
32
// beyond matrix
32
33
guard i >= 0 && i < m && j >= 0 && j < n else {
33
34
return
@@ -58,7 +59,7 @@ class WordSearchII {
58
59
visited [ i] [ j] = false
59
60
}
60
61
61
- func _convertToTrie( words: [ String ] ) -> Trie {
62
+ func _convertToTrie( _ words: [ String ] ) -> Trie {
62
63
let trie = Trie ( )
63
64
64
65
for str in words {
@@ -70,65 +71,71 @@ class WordSearchII {
70
71
}
71
72
72
73
73
- class TrieNode {
74
- var isEnd : Bool
75
- var letter : Character
76
- var children : [ Character : TrieNode ]
77
-
78
- init ( _ letter: Character ) {
79
- self . isEnd = false
80
- self . letter = letter
81
- self . children = [ Character: TrieNode] ( )
82
- }
83
- }
84
-
85
-
86
74
class Trie {
87
- var root : TrieNode ?
75
+ var root : TrieNode
88
76
89
77
init ( ) {
90
- root = TrieNode ( Character ( " 0 " ) )
78
+ root = TrieNode ( )
91
79
}
92
80
93
81
func insert( _ word: String ) {
94
82
var node = root
83
+ var word = [ Character] ( word. characters)
95
84
96
- for char in word {
97
- if node? . children [ char] == nil {
98
- node? . children [ char] = TrieNode ( char)
85
+ for i in 0 ..< word. count {
86
+ let c = word [ i]
87
+
88
+ if node. children [ c] == nil {
89
+ node. children [ c] = TrieNode ( )
99
90
}
100
91
101
- node = node? . children [ char ]
92
+ node = node. children [ c ] !
102
93
}
103
94
104
- node? . isEnd = true
95
+ node. isEnd = true
105
96
}
106
97
107
- func search ( _ word: String ) -> Bool {
98
+ func isWord ( _ word: String ) -> Bool {
108
99
var node = root
100
+ var word = [ Character] ( word. characters)
109
101
110
- for char in word {
111
- guard let childTrieNode = node? . children [ char] else {
102
+ for i in 0 ..< word. count {
103
+ let c = word [ i]
104
+
105
+ if node. children [ c] == nil {
112
106
return false
113
107
}
114
108
115
- node = childTrieNode
109
+ node = node . children [ c ] !
116
110
}
117
111
118
- return node? . isEnd
112
+ return node. isEnd
119
113
}
120
-
121
- func start ( with word : String ) -> Bool {
114
+
115
+ func isWordPrefix ( _ prefix : String ) -> Bool {
122
116
var node = root
117
+ var prefix = [ Character] ( prefix. characters)
123
118
124
- for char in word {
125
- guard let childTrieNode = node? . children [ char] else {
119
+ for i in 0 ..< prefix. count {
120
+ let c = prefix [ i]
121
+
122
+ if node. children [ c] == nil {
126
123
return false
127
124
}
128
125
129
- node = childTrieNode
126
+ node = node . children [ c ] !
130
127
}
131
128
132
129
return true
133
130
}
134
131
}
132
+
133
+ class TrieNode {
134
+ var isEnd : Bool
135
+ var children : [ Character : TrieNode ]
136
+
137
+ init ( ) {
138
+ isEnd = false
139
+ children = [ Character: TrieNode] ( )
140
+ }
141
+ }
0 commit comments