kmp原理

# 核心

next数组

即匹配的模式串中的前缀和每个位置的后缀的最大相等长度,在匹配失败后转到当前的next位置上

适用的问题:求模式串在模版串中出现的次数、位置等问题

# 性质

若j0是next[i]的一个候选项,即str[i-j0+1 ~ i] = str[1~j0],则长度小于j0的候选项中最大的是next[j0]

即next[j0]+1~j0+1 不是候选项,根据next数组的含义容易知晓

所以当next[i-1]计算完成后,next[i-1]的所有候选项为:

next[i-1]、next[next[i-1]]、.......

根据以上性质

匹配失败后,j=next[j]操作的次数不会超过每层for循环开始时的j与while结束时j的差

每一次匹配j最多加1,j非负所以,所以j减小的程度不会大于增加的程度,

所以j最多变化2*(m+n)次,时间复杂度O(m+n)

# 步骤

1)对模式串进行自我匹配,求出next数组,加速匹配失败时的过程

2)对模版串进行模式串的匹配,当长度等于模式串时,进行相应的操作,

否则从当前匹配失败的前一个位置的next位置继续匹配,只要不匹配一直进行该操作,直到模式串的头部为止

# kmp求有关字符串循环节问题

引理:s[1~n]具有长度为len循环节的充要条件是len | n ,并且s[ len+1~n ]=s[1~n-len]

其中s[1 ~ (n-next[n])] 为串s的最小循环节,n-next[n]为最小循环节的长度

而n-next[next[n]]为次小循环元的长度,类比可以求出其他

一个字符串的任意循环元的长度一定是最小循环元长度的倍数

1 2 3 4 5 1 这种情况下循环元长度是5,但是显然不能整除

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12521462.html
kmp