朴素匹配:
int search(char const* src, int slen, char const* patn, int plen)
{
int i = 0, j = 0;
while( i < slen && j < plen )
{
if( src[i] == patn[j] ) //如果相同,则两者++,继续比较
{
++i;
++j;
}
else
{
//否则,指针回溯,重新开始匹配
i = i - j + 1; //退回到最开始时比较的位置
j = 0;
}
}
if( j >= plen )
return i - plen; //如果字符串相同的长度大于模式串的长度,则匹配成功
else
return -1;
}
KMP算法:
void GetNext(char* t, int* next)
{
int i, j, len;
i = 0;
j = -1;
next[0] = -1;
while(t[i] != '\0')
{
if (j == -1 || t[i] == t[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int KMP(const char* src, int slen, const char* patn, int plen, const int* next, int pos)
{
int i = pos;
int j = 0;
if (plen == 0)
return(0);
while(i < slen && j < plen)
{
if(j == -1 || src[i] == patn[j])
{
++i;
++j;
}
else
{
j = next[j];
//当在j处,P[j]与S[i]匹配失败的时候直接用patn[nextval[j]]继续与S[i]比较,
//所以,KMP算法的关键之处就在于怎么求这个值拉,
//即匹配失效后下一次匹配的位置。
}
}
if( j >= plen )
return i - plen;
else
return -1;
}