99 */
1010
1111class WordSearchII {
12- func findWords( board: [ [ Character ] ] , _ words: [ String ] ) -> [ String ] {
12+
13+ func findWords( _ board: [ [ Character ] ] , _ words: [ String ] ) -> [ String ] {
1314 var res = [ String] ( )
1415
1516 let m = board. count
1617 let n = board [ 0 ] . count
1718
1819 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 )
2021
21- for i in 0 ..< m {
22- for j in 0 ..< n {
22+ for i in 0 ..< m {
23+ for j in 0 ..< n {
2324 _dfs ( board, m, n, i, j, & visited, & res, trie, " " )
2425 }
2526 }
2627
2728 return res
2829 }
2930
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 ) {
3132 // beyond matrix
3233 guard i >= 0 && i < m && j >= 0 && j < n else {
3334 return
@@ -58,7 +59,7 @@ class WordSearchII {
5859 visited [ i] [ j] = false
5960 }
6061
61- func _convertToTrie( words: [ String ] ) -> Trie {
62+ func _convertToTrie( _ words: [ String ] ) -> Trie {
6263 let trie = Trie ( )
6364
6465 for str in words {
@@ -70,65 +71,71 @@ class WordSearchII {
7071}
7172
7273
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-
8674class Trie {
87- var root : TrieNode ?
75+ var root : TrieNode
8876
8977 init ( ) {
90- root = TrieNode ( Character ( " 0 " ) )
78+ root = TrieNode ( )
9179 }
9280
9381 func insert( _ word: String ) {
9482 var node = root
83+ var word = [ Character] ( word. characters)
9584
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 ( )
9990 }
10091
101- node = node? . children [ char ]
92+ node = node. children [ c ] !
10293 }
10394
104- node? . isEnd = true
95+ node. isEnd = true
10596 }
10697
107- func search ( _ word: String ) -> Bool {
98+ func isWord ( _ word: String ) -> Bool {
10899 var node = root
100+ var word = [ Character] ( word. characters)
109101
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 {
112106 return false
113107 }
114108
115- node = childTrieNode
109+ node = node . children [ c ] !
116110 }
117111
118- return node? . isEnd
112+ return node. isEnd
119113 }
120-
121- func start ( with word : String ) -> Bool {
114+
115+ func isWordPrefix ( _ prefix : String ) -> Bool {
122116 var node = root
117+ var prefix = [ Character] ( prefix. characters)
123118
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 {
126123 return false
127124 }
128125
129- node = childTrieNode
126+ node = node . children [ c ] !
130127 }
131128
132129 return true
133130 }
134131}
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