package util import ( "strings" ) type Node struct { //rune表示一个utf8字符 char rune Data interface{} parent *Node Depth int //childs 用来当前节点的所有孩子节点 childs map[rune]*Node term bool } type Trie struct { root *Node size int } func NewNode() *Node { return &Node{ childs: make(map[rune]*Node, 32), } } func NewTrie() *Trie { return &Trie{ root: NewNode(), } } //假如我要把 敏感词: “我操” // Add("我操", nil) // Add("色情片", nil) func (p *Trie) Add(key string, data interface{}) (err error) { key = strings.TrimSpace(key) node := p.root runes := []rune(key) for _, r := range runes { ret, ok := node.childs[r] if !ok { ret = NewNode() ret.Depth = node.Depth + 1 ret.char = r node.childs[r] = ret } node = ret } node.term = true node.Data = data return } // findNode("色情片") func (p *Trie) findNode(key string) (result *Node) { node := p.root chars := []rune(key) for _, v := range chars { ret, ok := node.childs[v] if !ok { return } node = ret } result = node return } func (p *Trie) collectNode(node *Node) (result []*Node) { if node == nil { return } if node.term { result = append(result, node) return } var queue []*Node queue = append(queue, node) for i := 0; i < len(queue); i++ { if queue[i].term { result = append(result, queue[i]) continue } for _, v1 := range queue[i].childs { queue = append(queue, v1) } } return } func (p *Trie) PrefixSearch(key string) (result []*Node) { node := p.findNode(key) if node == nil { return } result = p.collectNode(node) return } // text = "我们都喜欢王八蛋" // replace = "***" func (p *Trie) Check(text, replace string) (result string, hit bool) { chars := []rune(text) if p.root == nil { return } var left []rune node := p.root start := 0 for index, v := range chars { ret, ok := node.childs[v] if !ok { left = append(left, chars[start:index+1]...) start = index + 1 node = p.root continue } node = ret if ret.term { hit = true node = p.root left = append(left, ([]rune(replace))...) start = index + 1 continue } } result = string(left) return }
package util import ( "fmt" "testing" ) func TestTrie(t *testing.T) { trie := NewTrie() trie.Add("黄色", nil) trie.Add("绿色", nil) trie.Add("蓝色", nil) result, str := trie.Check("我们这里有一个黄色的灯泡,他存在了很久。他是蓝色的。", "***") fmt.Printf("result:%#v, str:%v\n", result, str) }
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/11980046.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能