1 Star 1 Fork 2

kristas / booting-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
trie_tree.go 1.30 KB
一键复制 编辑 原始数据 按行查看 历史
kristas 提交于 2021-05-28 14:43 . feat: add trie tree util
package trie_tree
import (
"encoding/json"
)
type TrieNode struct {
Ch byte
Child []*TrieNode
}
func (r TrieNode) String() string {
bytes, _ := json.Marshal(r)
return string(bytes)
}
func NewTrieTree() (trie *TrieNode) {
return &TrieNode{}
}
func newNode(c byte) *TrieNode {
return &TrieNode{
Ch: c,
}
}
func (r *TrieNode) Insert(s string) {
curr := r
for i := range s {
if n := curr.findChild(s[i]); n == nil {
nn := newNode(s[i])
curr.Child = append(curr.Child, nn)
curr = nn
} else {
curr = n
}
}
}
func (r *TrieNode) Search(s string) []string {
var curr = r
for i := range s {
if n := curr.findChild(s[i]); n != nil {
curr = n
} else {
return nil
}
}
lists := walkNode(curr)
for i := range lists {
var rlt = lists[i]
if len(rlt) > 0 {
rlt = rlt[1:]
}
lists[i] = s + rlt
}
return lists
}
type list []string
func walkNode(node *TrieNode) (l list) {
if node == nil {
return
}
if node.Child == nil {
l = append(l, string(node.Ch))
return
}
for i := range node.Child {
subs := walkNode(node.Child[i])
for j := range subs {
l = append(l, string(node.Ch)+subs[j])
}
}
return
}
func (r *TrieNode) findChild(character byte) (n *TrieNode) {
for i := range r.Child {
c := r.Child[i]
if c.Ch == character {
n = c
break
}
}
return
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/kristas/booting-go.git
git@gitee.com:kristas/booting-go.git
kristas
booting-go
booting-go
v1.3.8

搜索帮助

344bd9b3 5694891 D2dac590 5694891