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列表的算法,还是没理解过来。

上一篇 下一篇

猜你喜欢

热点阅读