Skip to content

Commit 8ff835b

Browse files
committed
Create: 0211-design-add-and-search-words-data-structure.scala
1 parent 4cd962d commit 8ff835b

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import scala.collection.mutable.HashMap
2+
3+
class WordDictionary() {
4+
val trie = new Trie()
5+
6+
def addWord(word: String) {
7+
trie.insert(word)
8+
}
9+
10+
def search(word: String): Boolean = {
11+
trie.search(word)
12+
}
13+
14+
}
15+
16+
class Trie() {
17+
class TrieNode {
18+
val children: HashMap[Char, TrieNode] = HashMap()
19+
var isEndOfWord = false
20+
}
21+
22+
private var root: TrieNode = new TrieNode()
23+
24+
def insert(word: String): Unit = {
25+
var curr = root
26+
word.foreach(c => {
27+
if (!curr.children.contains(c)) {
28+
curr.children(c) = new TrieNode()
29+
}
30+
31+
curr = curr.children(c)
32+
})
33+
34+
curr.isEndOfWord = true
35+
}
36+
37+
def search(word: String): Boolean = {
38+
def helper(currNode: TrieNode, currCharIndex: Int): Boolean = {
39+
if (currCharIndex == word.length) {
40+
return currNode.isEndOfWord
41+
}
42+
43+
val currChar = word(currCharIndex)
44+
if (currChar == '.') {
45+
var isFound = false
46+
47+
for ((_, childNode) <- currNode.children if !isFound) {
48+
isFound = helper(childNode, currCharIndex + 1)
49+
}
50+
51+
return isFound
52+
} else {
53+
if (currNode.children.contains(currChar)) {
54+
return helper(currNode.children(currChar), currCharIndex + 1)
55+
} else {
56+
return false
57+
}
58+
}
59+
}
60+
61+
helper(root, 0)
62+
}
63+
}
64+
65+
/**
66+
* Your WordDictionary object will be instantiated and called as such:
67+
* var obj = new WordDictionary()
68+
* obj.addWord(word)
69+
* var param_2 = obj.search(word)
70+
*/

0 commit comments

Comments
 (0)