bf匹配算法的思想是每次主串和模式串都从0开始匹配,当出现失匹的时候模式串将回退到起点,主串将回退到本次匹配起点的下一位置然后重新进行匹配,这样的匹配方式虽然好理解但是时间复杂度比较高,而kmp每次出现失匹的情况只有模式串回退,主串不回退,如果当前失匹点的位置为s[i],并且前k个元素和从头往后数k个元素匹配(即:"s[0]s[1]s[2]…s[k-1] = "s[i-k].....s[i-1]"),那么主串从上一位置一直往前k个元素和s[0]到s[k--1]肯定是匹配的,所以只需要比较当前位置和模式串的k位置是否匹配就可以了.
/*
a为主串,b为模式串,n为主串长度,m为模式串长度,从主串的第pos位置开始往后比较
*/
int kmp(char a[], char b[], int n, int m, int pos)
{
int i = pos, j = 0;//将主串的初始位置指向pos位置,模式串从头开始比较
while(i < n)
{
if(j == -1 || a[i] == b[j])//如果当前位置匹配,那么继续匹配下一位置;
{
/*
j == -1的情况是如果上次在某位置失匹并且模式串中没有一个k位置使得模式串中当前位置的前k个位置和从头开始k个位置相匹配
那么就让j回退到-1直接从主串的下一个点和模式串的第一个点进行匹配
*/
++i;
++j;
}
else
j = next[j];//如果失匹模式串回退到k位置继续进行匹配(即:next[j]位置)
if(j >= m)//如果j匹配