package main
import "fmt"
type Trie struct {
IsWord bool
Children map[rune]*Trie
}
/** Initialize your data structure here. */
func Constructor() Trie {
return Trie{IsWord: false, Children: make(map[rune]*Trie)}
}
/** Inserts a word into the trie. */
func (this *Trie) Insert(word string) {
root := this
for _, item := range word {
p := item - 'a'
if root.Children[p] == nil {
root.Children[p] = &Trie{IsWord: false, Children: make(map[rune]*Trie)}
}
root = root.Children[p]
}
root.IsWord = true
}
/** Returns if the word is in the trie. */
func (this *Trie) Search(word string) bool {
root := this
for _, item := range word {
p := item - 'a'
if root.Children[p] == nil {
return false
}
root = root.Children[p]
}
return root.IsWord && root != nil
}
/** Returns if there is any word in the trie that starts with the given prefix. */
func (this *Trie) StartsWith(prefix string) bool {
root := this
for _, item := range prefix {
p := item - 'a'
if root.Children[p] == nil {
return false
}
root = root.Children[p]
}
return root != nil
}
/**
* 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);
*/
func main() {
trie := Constructor()
trie.Insert("hello")
trie.Insert("world")
res := trie.Search("hel")
fmt.Println(res, trie)
}