You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1018 B
Go
59 lines
1018 B
Go
3 years ago
|
package trie
|
||
|
|
||
|
type (
|
||
|
// trieNode 节点
|
||
|
trieNode struct {
|
||
|
char string // unicode
|
||
|
isEnding bool // 是否单词结尾
|
||
|
children map[rune]*trieNode // 子节点
|
||
|
}
|
||
|
|
||
|
// Trie 字典树(前缀树)(多叉树)
|
||
|
Trie struct {
|
||
|
root *trieNode // 根节点指针
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func NewTrieNode(char string) *trieNode {
|
||
|
return &trieNode{
|
||
|
char: char,
|
||
|
isEnding: false,
|
||
|
children: make(map[rune]*trieNode),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func NewTrie() *Trie {
|
||
|
// 初始化根
|
||
|
trieNode := NewTrieNode("/")
|
||
|
return &Trie{trieNode}
|
||
|
}
|
||
|
|
||
|
// Insert 插入一个单词
|
||
|
func (t *Trie) Insert(word string) {
|
||
|
node := t.root
|
||
|
for _, code := range word {
|
||
|
v, ok := node.children[code]
|
||
|
if !ok {
|
||
|
v = NewTrieNode(string(code))
|
||
|
node.children[code] = v
|
||
|
}
|
||
|
node = v
|
||
|
}
|
||
|
node.isEnding = true
|
||
|
}
|
||
|
|
||
|
func (t *Trie) Exists(word string) bool {
|
||
|
node := t.root
|
||
|
for _, code := range word {
|
||
|
v, ok := node.children[code]
|
||
|
if !ok {
|
||
|
return false
|
||
|
}
|
||
|
node = v
|
||
|
}
|
||
|
if node.isEnding == false {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|