理论基础
KMP算法使用
KMP算法一般用于解决字符串匹配的问题。给定一个文本串和模式串,判断模式串是否存在于文本串中,存在返回第一个匹配字符的下标。对于这类问题,暴力求解的复杂度一般为O(m*n); m,n分别为文本串和模式串的长度。但KMP的时间复杂度为O(m+n), 其中m的部分是遍历文本串,而n的部分包含了构建next数组
基本思想
最基本的匹配思想是,当遇到冲突字符时,只会将模式串向后移动,重头开始匹配。而KMP算法是从冲突的位置跳到之前能匹配到的内容。
之前能匹配到的内容如何确定?
因为冲突位置不匹配,而冲突位置之前的子串,其实都是匹配的。那么其实就是想要不只后移一次,要后移很多次。那么就是想要移动多次,使得子串的前缀能够和冲突位置之前的那部分匹配上 ,而这部分就是子串的后缀。所以我们想要的移动到的位置就是:这个前缀后面的一个位置。
为了求这个位置,我们需要最长相等前后缀有多长
前缀表
前缀表就是用来存储最长相等前后缀的长度。
前缀:包含首字母,不包含尾字母的子串;后缀:包含尾字母,不包含首字母的子串
而这个长度其实就是前缀后面的位置,如果i