前言
之前写过一次kmp,当时采取的是比较常见的通过匹配来计算next数组,
当时的那个确实很麻烦,这次我们给出一个更好的算法。
之前的next数组求法是这样的:(给一下连链接)
然后我们将带来新的字符串匹配算法,并且给出几种简单的算法
求next数组的新方法
先复习一下kmp算法:
正常的匹配是如果匹配失败就将子串和主串都进行回退,然后重新开始匹配,但我们并不认为我们一定需要回退到子串的开始处,所以我们给出了next数组,来减少回退的程度。
输入主串T(长n),和子串P(长m),寻找子串和主串匹配成功的起始位置。
我们这里的kmp算法和之前还是有很多的不一样,而且个人感觉这种方式更容易理解。
这里我们计算next数组采取的方式为前缀法:
- 我们需要将数组的0位补上0,作为边界条件
- 从第一个字符开始,每次将串增多一个,将其不包括本身的前缀和后缀都找出来,找到其中最长的相同前后缀。
我们看一下pappar的例子吧。
我们从p开始,因为不能和本体重复,所以没有前后缀