三九宝宝网宝宝百科宝宝知识

KMP算法求next数组的问题

01月07日 编辑 39baobao.com

字符串如果是以0为下标的话next[7]是0,只有最后一位与第一位相等。

在第i个字符前面的i-1个字符里面,

从开头开始的1个字符与最后1个字符是否相等,若不是,则next[i]=0;

从开头开始的2个字符与最后2个字符是否相等,若不是,则next[i]=1;

从开头开始的3个字符与最后3个字符是否相等,若不是,则next[i]=2;

前缀next数组的求解算法:

void SetPrefix(const char *Pattern, int prefix[])

{

int len=CharLen(Pattern);//模式字符串长度。

prefix[0]=0;

for(int i=1; i

{

int k=prefix[i-1];

//不断递归判断是否存在子对称,k=0说明不再有子对称,Pattern[i] != Pattern[k]说明虽然对称,但是对称后面的值和当前的字符值不相等,所以继续递推。

扩展资料:

kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm)。kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)。

参考资料来源:百科-简约KMP算法

推荐阅读
图文推荐