kmp算法学习(一)基本原理

340 阅读1分钟

KMP算法要解决的问题

在暴力字符串匹配算法里匹配流程是这样:

到了模式串最后一位B匹配失败之后会回退成这个样子

i;j代表字符串和模式串当前的所在的位置。 第一次匹配:

i=5;j=5

第二次匹配:

i=1;j=0;

匹配失败之后 i进行了回退,j也进行了回退。

这个时候导致的问题就是算法时间复杂度变成了O(m*n)。

而kmp算法出现也是为了解决这个问题。

KMP的匹配如下:

第一次匹配:

i=5;j=5

第二次匹配:

i=6;j=1;

在匹配失败了之后找到重叠的部分继续比较,i并不会回退。

这样的时间复杂度就是O(m+n)。

所以KMP解决的问题就是在匹配失败之后根据已有的信息,决定字符串i+1位置和模式串的哪个位置进行匹配。