mirror of
https://gitlab.com/mfocko/LeetCode.git
synced 2024-11-09 15:59:06 +01:00
go: add «208. Implement Trie (Prefix Tree)»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
5612db7232
commit
78f4a78500
1 changed files with 85 additions and 0 deletions
85
go/implement-trie-prefix-tree.go
Normal file
85
go/implement-trie-prefix-tree.go
Normal file
|
@ -0,0 +1,85 @@
|
|||
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);
|
||||
*/
|
Loading…
Reference in a new issue