我有一个字符串数组,需要在Golang中创建后缀树。因为SuffixArray仅接受字节数组(即单个字符串),所以它无法满足我的需求。请问是否有人能提供相关实现的指导?
谢谢!
我有一个字符串数组,需要在Golang中创建后缀树。因为SuffixArray仅接受字节数组(即单个字符串),所以它无法满足我的需求。请问是否有人能提供相关实现的指导?
谢谢!
\x00
,这个前缀不会出现在字符串中。package main
import (
"fmt"
"index/suffixarray"
"regexp"
"strings"
)
func main() {
words := []string{
"aardvark",
"happy",
"hello",
"hero",
"he",
"hotel",
}
// use \x00 to start each string
joinedStrings := "\x00" + strings.Join(words, "\x00")
sa := suffixarray.New([]byte(joinedStrings))
// User has typed in "he"
match, err := regexp.Compile("\x00he[^\x00]*")
if err != nil {
panic(err)
}
ms := sa.FindAllIndex(match, -1)
for _, m := range ms {
start, end := m[0], m[1]
fmt.Printf("match = %q\n", joinedStrings[start+1:end])
}
}
打印
match = "hello"
match = "hero"
match = "he"
byte[]
方面很好,但请注意您的正则表达式模式打败了后缀数组的目的,因为您只查看单词的开头。如果要查看前缀,您不需要像后缀数组那样强大的工具-只需对原始字符串进行排序并执行二进制搜索即可。后缀数组的真正威力在于查找单词内的匹配项,而不仅仅是开头。 - Eli Benderskymatch, err := regexp.Compile("[^\x00]*wor[^\x00]*")
获取包含“wor”的字符串。请注意,正确的字符串是joinedStrings[start:end]
。
SuffixArray
在其实现中已经使用了指针。 :) - user1804599