前言:
前段时间学习和字符串相关的算法,自然学到了KMP算法(解决单字符串匹配问题)。这里简单记录一下,方便以后回忆。
先给出二个名词,模式串(P), 文本串(T)。 比如ABC是否是ASDABC的子串,这里ABC是模式串(P),ASDABC是文本串,也叫被匹配串。
引入:
KMP算法其实就是两个部分,①:前缀函数(求前缀数组)②:匹配部分。
那么什么是前缀函数呢??这是本篇文章的内容,为什么需要这个前缀函数这里先不解释,下篇文章讨论。
前缀函数:
前缀函数的功能是求出”模式串“的next[ ]数组。
首先要了解三个概念,前缀、后缀、匹配值。
①本算法中的"前缀"和"后缀": "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。
//比如ababa的前缀a,ab,aba,abab (注意没有ababa) 后缀有b,ba,aba,baba(注意没有ababa)
②匹配值:就是字符串中"前缀"和"后缀"的最长的共有元素的长度。对于ababa来说就是3,说明ababa的“前3个字符”与“后3个字符”相同aba.(PS:这里我们也可以看出为什么前缀不包括最后一个字符,后缀不包括第一个字符了,因为包括的话就没意义了。。ababa前5个字符等于后5个字符,匹配值等于它长度就好了。。)