File tree Expand file tree Collapse file tree 1 file changed +55
-0
lines changed
design-add-and-search-words-data-structure Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Original file line number Diff line number Diff line change
1
+ class WordDictionary {
2
+ class TrieNode {
3
+ var children : [ Character : TrieNode ] = [ : ]
4
+ var isEndOfWord = false
5
+ }
6
+
7
+ private var root : TrieNode
8
+
9
+ init ( ) {
10
+ root = TrieNode ( )
11
+ }
12
+
13
+ // O(n) time / O(n) space
14
+ func addWord( _ word: String ) {
15
+ var node = root
16
+
17
+ for character in word {
18
+ if node. children [ character] == nil {
19
+ node. children [ character] = TrieNode ( )
20
+ }
21
+
22
+ node = node. children [ character] !
23
+ }
24
+
25
+ node. isEndOfWord = true
26
+ }
27
+
28
+ // O(m) ~ O(26^m) time / O(1) space
29
+ func search( _ word: String ) -> Bool {
30
+ return dfs ( word: Array ( word) , index: 0 , node: root)
31
+ }
32
+
33
+ private func dfs( word: [ Character ] , index: Int , node: TrieNode ) -> Bool {
34
+ if index == word. count {
35
+ return node. isEndOfWord
36
+ }
37
+
38
+ let character = word [ index]
39
+
40
+ if character == " . " {
41
+ for child in node. children. values {
42
+ if dfs ( word: word, index: index + 1 , node: child) {
43
+ return true
44
+ }
45
+ }
46
+ return false
47
+ } else {
48
+ guard let child = node. children [ character] else {
49
+ return false
50
+ }
51
+ return dfs ( word: word, index: index + 1 , node: child)
52
+ }
53
+ }
54
+ }
55
+
You can’t perform that action at this time.
0 commit comments