//
//输入:
//s指向被搜索的内存块;
//p指向要搜索的字符串;
//s_len为被搜索的内存块长度;
//p_len为要搜索的字符串长度;
//输出:
//若匹配,返回匹配的头位置;
//若不匹配,返回-1
//
int my_kmp(const char *s, const char *p, int s_len, int p_len)
{
//未验证传入参数的可靠性
//算出next数组
char *nextv = new char[p_len];
int i=0,j=-1;
nextv[0]=-1;
while(i<p_len-1)
{
if(j==-1 || p[i]==p[j])
{
++i;++j;
if(p[i]!=p[j])
{
nextv[i]=j;
}
else
{
nextv[i]=nextv[j];
}
}
else
{
j=nextv[j];
}
}
//开始匹配
i=0,j=0;
while(i<s_len && j<p_len)
{
if(j==-1 || s[i]==p[j])
{
i++;j++;
}
else
{
j=nextv[j];
}
}
delete nextv;
if(j==p_len)
{
return i-p_len;
}
else
{
return -1;
}
}