kmp中部分匹配表的计算
2020-04-08 本文已影响0人
舒小贱
/*
思路就是:遍历pattern字符串,每新加一个letter:
对于prefix列表,都是原来元素不动,新加上一个pattern[:idx]元素
suffix列表,对其中的每个元素拼接上letter,然后新加一个值为letter的元素
然后比较prefix和suffix列表相同的元素(prefix和suffix的个数和长度都是一一对应的,所以这里只需要遍历一次prefix或suffix,而不是对prefix和suffix做两层遍历),计算相同元素中的最大长度。
**/
func main() {
pattern := "AAACAAAAAC" //lps[] is [0, 1, 0, 1, 2, 0, 1, 2, 3, 4, 5]
table := getPatternTable(pattern)
res, _ := json.Marshal(table)
fmt.Println(string(res))
}
func getPatternTable(p string) []int {
table := []int{0}
var prefix []string
var suffix []string
for idx := 1; idx < len(p); idx++ {
dd := 0
prefix = append(prefix, p[:idx])
for i := 0; i < len(suffix); i++ {
suffix[i] = suffix[i] + string(p[idx])
}
suffix = append(suffix, string(p[idx]))
for i := 0; i < len(prefix); i++ {
if prefix[i] == suffix[len(prefix)-1-i] {
if len(prefix[i]) > dd {
dd = len(prefix[i]) //共同的前后缀的最长长度,而不是个数
}
}
}
table = append(table, dd)
}
return table
}
对于参考中计算lps列表的算法,还是没理解过来。