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位置和模式串的哪个位置进行匹配。