赞
踩
字典树可以用来快速在一个字符串集合中查找给定的字符串以及前缀。
// 定义字典树节点 type trieNode struct { children [26]*trieNode end bool } // 字典树根节点 type Trie struct { root *trieNode } // 构建字典树 func Constructor() Trie { return Trie{root: &trieNode{}} } // 实现插入单词的操作 func (this *Trie) Insert(word string) { //首先获取到树的根节点 node := this.root //依次遍历word的每个字符 for _, v := range word { //如果当前字典树的这一层中未出现过该字母,则创建一个节点,如果已经出现过了就不用创建了 if node.children[v-'a'] == nil { node.children[v-'a'] = &trieNode{} } //将当前节点替换为下一层的节点 node = node.children[v-'a'] } //将单词最后一个字母节点的end设置为true,表明这是一个单词的结尾 node.end = true } // 寻找字典树中是否有单词的操作 func (this *Trie) search(word string) *trieNode { node := this.root //遍历要寻找的单词 for _, v := range word { //如果这个字符不存在那么直接返回nil,说明未找到 if node.children[v-'a'] == nil { return nil } node = node.children[v-'a'] } //返回最终找到的节点 return node } // 找树中是否存在这个单词 func (this *Trie) Search(word string) bool { node := this.search(word) //调用查找操作,一定要满足找到了节点并且节点是单词结尾的节点 return node != nil && node.end } // 找树中是否存在这个前缀 func (this *Trie) StartsWith(prefix string) bool { node := this.search(prefix) //调用查找操作,只需要找到节点就好,不需要满足一定是结尾节点 return node != nil }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。