前言
首先已知暴力解法。
暴力解法会遇到一个问题,就是模式串相对于主串匹配时只右移一位,如何才能保证每次尽可能多地移动,但又不会影响字符串匹配时的准确度呢?诸多字符串匹配算法都是为了解决这个问题而产生的。
KMP算法
kmp算法的核心是根据模式串生成一个next数组,对应模式串中的不同位置(index),next中会对应一个相应的值。在模式串匹配过程中,记录遇到的第一个坏字符在模式串中的位置 i ,以及此时位置对应的next[i], 就可以得出移动的位数:
L
=
i
−
n
e
x
t
[
i
]
L = i- next[i]
L=i−next[i]
所以重点是next数组的求法,目前我看到一种是最长匹配前缀字串的长度,一种是最长匹配前缀字串结尾对应的下标,两者是差1的关系(假如“aba”是所谓的最长匹配前缀字串,那么它的长度为3,结尾数对应下标为2),上文中提到的公式,使用的是以“长度”为next数组值时的写法。
next数组的求法:
暴力算法很简单。
动态规划的算法下次再补充。