KMP模式匹配
一、引言
模式匹配问题是指:寻找目标串 s 中与模式串 p 完全相同的子串。
初遇这个问题,我们都能想到用暴力循环的方法进行解决
int violence(char *s , char *p) //s中包含p返回第一次出现位置的下标,否则返回-1
{
int slen = strlen(s);
int plen = strlen(p);
for (int i = 0 ; i <= slen - plen ; i++)
{
for (int j = 0 ; j <= plen ; j++) //从s[i]的位置开始匹配p中的各个元素,如有不同则接着判断s[i + 1]
{
if (j == plen)
return i;
else
{
if (s[i + j] == p[j])
continue;
else
break;
}
}
}
return -1;
}
暴力法自然可以完成模式匹配,但这种方法的时间复杂度过高,为 o(m * n) (m,n分别是 s 与 p 的字符串长度),所以我们要用其他更好的方法来实现模式匹配,这个方法就是 KMP算法 !
二、初探KMP
在学习KMP算法之前,我们先用一个例子分析一下暴力循环的方法:
1、s[