字符串匹配:KMP 算法
KMP算法:主要应用在字符串匹配的问题;
主要思想:当出现字符串不匹配时,可以根据已经匹配的文本内容,避免暴力的从投再匹配;
-
其中最主要的是next组数【前缀表】:记录了模式串和主串不匹配的时候,模式串应该从哪里重新开始匹配【相同字符串的传递性】;
-
next数组里的数字表示的是什么,为什么这么表示?
- 前缀表:记录下标i之前【包括i】的字符串中,有多大长度的相同前缀后缀,【当字符串的前后缀都没有相同子字符串的时候,和暴力破解相同】;
- 前缀:不包含最后一个字符的所有以第一个字符开头的连续字符串;
- 后缀:不包含第一个字符的所有以最后一个字符结尾的连续子字符串;
- 前缀表:要求相同前缀和后缀的最大长度;
- 如何计算Next表【前缀表】:
- 模式串与前缀表对应位置的关系是:记录下标i之前【包括i】的字符串中,有多大长度的相同前缀后缀;
- 前缀表内有:两个下标:
- j表示具有最大的相同前后缀的长度,即最大相同前缀的末尾,因此在j的字符串内,前后缀相同;next记录的就是j的值;
- i表示后缀的的末尾,做i和j作比较,也就是i和j字符串的前缀做对比【可以理解为另一个字符串匹配问题,但是模式字符串j的长度是变化的】;
- 当字符匹配的时:j的长度在以前的基础上 +1,并记录在next,然后在设定j+1的字符串为模式串,在进行与i + 1主串做对比;
- 当不匹配的时候,就要寻找当前下的最大前后缀长度,所以使用 j = next[j -1],可以获得从哪里重新开始,而避免重新匹配;
-
在重复字符串的判断中,
-
移动匹配方法;
-
KMP方法;
-
在next表【前后缀表】统计各个位置为终点的最长相同前后缀的长度 ;
-
如果这个字符串s是由重复子串组成,那么最长相等前后缀不包含的子串是字符串s的最小重复子串。并且也是可以被s整除的【当最长相等前周】;
-
-

浙公网安备 33010602011771号