提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
记录KMP算法学习思路:
之后用到的主串S和子串T中的S[0]和T[0]存储的是该字符串的长度,S[1]和T[1]存储的才是当前字符串的第一个元素。
提示:以下是本篇文章正文内容,下面案例可供参考
一、朴素的模式匹配算法(BF暴力匹配算法)
有一主串S、子串T,返回在S中和T完全相同时的index。在朴素的模式匹配算法(BF暴力匹配算法)中是:简单来说就是:从主串s 和子串t 的第一个字符开始,将两字符串的字符一一比对,如果出现某个字符不匹配,主串回溯到第二个字符,子串回溯到第一个字符再进行一一比对。如果出现某个字符不匹配,主串回溯到第三个字符,子串回溯到第一个字符再进行一一比对…一直到子串字符全部匹配成功。
图片来看更容易理解:
竖直线表示相等,闪电线表示不等
第一个过程:子串“goo”部分与主串相等,'g’不等,结束比对,进行回溯。
第二个过程:开始时就不匹配,直接回溯
第三个过程:开始时即不匹配,直接回溯
第四个过程:开始时即不匹配,直接回溯
第五个过程:匹配成功
这种算法在最好情况下时间复杂度为O(n)。即子串的n个字符正好等于主串的前n个字符,而最坏的情况下时间复杂度为O(m*n)。
二、KMP算法
搞清楚KMP算法前,先用图片搞清楚KMP算法好在哪里:
在此之前插入一个概念:
前缀:包含第一个字符,但是不包含最后一个字符
后缀:包含最后一个字符,但是不包含第一个字符
现在我们先看一个图:第一个长条代表主串,第二个长条代表子串。红色部分代表两串中已匹配的部分,
绿色和蓝色部分分别代表主串和子串中不匹配的字符。
再具体一些:这个图代表主串"abcabeabcabcmn"和子串"abcabcmn"。
第一张图:
现在发现了不匹配的地方,根据KMP的思想我们要将子串向后移动,现在解决要移动多少的问题。
之前提到的最长相等前后缀的概念有用处了。因为红色部分也会有最长相等前后缀。
第二张图:
灰色部分就是红色部分字符串的最长相等前后缀,我们子串移动的结果就是让子串的红色部分最长相等前缀和主串红色部分最长相等后缀对齐。
第三张图: