mirror of
https://gitlab.com/mfocko/LeetCode.git
synced 2024-11-14 01:49:41 +01:00
86 lines
1.3 KiB
Go
86 lines
1.3 KiB
Go
|
package implement_trie_prefix_tree
|
||
|
|
||
|
type TrieNode struct {
|
||
|
has bool
|
||
|
successors [26]*TrieNode
|
||
|
}
|
||
|
|
||
|
type Trie struct {
|
||
|
root TrieNode
|
||
|
}
|
||
|
|
||
|
func Constructor() Trie {
|
||
|
return Trie{}
|
||
|
}
|
||
|
|
||
|
func (this *Trie) Insert(word string) {
|
||
|
node := &this.root
|
||
|
|
||
|
for _, c := range word {
|
||
|
idx := int(c) - int('a')
|
||
|
|
||
|
if node.successors[idx] == nil {
|
||
|
node.successors[idx] = new(TrieNode)
|
||
|
}
|
||
|
node = node.successors[idx]
|
||
|
}
|
||
|
|
||
|
node.has = true
|
||
|
}
|
||
|
|
||
|
func (this *Trie) findPrefix(prefix string) *TrieNode {
|
||
|
node := &this.root
|
||
|
|
||
|
for _, c := range prefix {
|
||
|
idx := int(c) - int('a')
|
||
|
|
||
|
if node.successors[idx] == nil {
|
||
|
return nil
|
||
|
}
|
||
|
node = node.successors[idx]
|
||
|
}
|
||
|
|
||
|
return node
|
||
|
}
|
||
|
|
||
|
func (this *Trie) Search(word string) bool {
|
||
|
node := this.findPrefix(word)
|
||
|
return node != nil && node.has
|
||
|
}
|
||
|
|
||
|
func (this *Trie) StartsWith(prefix string) bool {
|
||
|
var terminates func(*TrieNode) bool
|
||
|
terminates = func(node *TrieNode) bool {
|
||
|
if node == nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
if node.has {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
for _, succ := range node.successors {
|
||
|
if terminates(succ) {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
node := this.findPrefix(prefix)
|
||
|
if node == nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
return terminates(node)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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);
|
||
|
*/
|