-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0208.go
103 lines (95 loc) · 2.93 KB
/
0208.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Source: https://leetcode.com/problems/implement-trie-prefix-tree
// Title: Implement Trie (Prefix Tree)
// Difficulty: Medium
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A **trie** (https://en.wikipedia.org/wiki/Trie) (pronounced as "try") or **prefix tree** is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and spellchecker.
//
// Implement the Trie class:
//
// - `Trie()` Initializes the trie object.
// - `void insert(String word)` Inserts the string `word` into the trie.
// - `boolean search(String word)` Returns `true` if the string `word` is in the trie (i.e., was inserted before), and `false` otherwise.
// - `boolean startsWith(String prefix)` Returns `true` if there is a previously inserted string `word` that has the prefix `prefix`, and `false` otherwise.
//
// **Example 1:**
//
// ```
// Input
//
// ["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
// [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
// Output
//
// [null, null, true, false, true, null, true]
//
// Explanation
//
// Trie trie = new Trie();
// trie.insert("apple");
// trie.search("apple"); // return True
// trie.search("app"); // return False
// trie.startsWith("app"); // return True
// trie.insert("app");
// trie.search("app"); // return True
// ```
//
// **Constraints:**
//
// - `1 <= word.length, prefix.length <= 2000`
// - `word` and `prefix` consist only of lowercase English letters.
// - At most `3 * 10^4` calls **in total** will be made to `insert`, `search`, and `startsWith`.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package main
/**
* Your Trie object will be instantiated and called as such:
* obj := Constructor();
* obj.Insert(word);
* param_2 := obj.Search(word);
* param_3 := obj.StartsWith(prefix);
*/
type Trie struct {
children map[rune]*Trie // child nodes
isWord bool // whether this node represent a word
}
func Constructor() Trie {
return Trie{
children: make(map[rune]*Trie),
}
}
func (this *Trie) Insert(word string) {
node := this
for _, ch := range word {
nextNode := node.children[ch]
if nextNode == nil {
newNode := Constructor()
nextNode = &newNode
node.children[ch] = nextNode
}
node = nextNode
}
node.isWord = true
}
func (this *Trie) Search(word string) bool {
node := this
for _, ch := range word {
nextNode := node.children[ch]
if nextNode == nil {
return false
}
node = nextNode
}
return node.isWord
}
func (this *Trie) StartsWith(prefix string) bool {
node := this
for _, ch := range prefix {
nextNode := node.children[ch]
if nextNode == nil {
return false
}
node = nextNode
}
return true
}