下面是next数组的生成算法:
void GetNextEx(char *T, char *next)
{
int i=1,j=0; next[1] = 0;
while(i < T[0])
{
if (j == 0 || T[i] == T[j])
{
++i; ++j;
if (T[i] == T[j])
next[i] = next[j];
else
next[i] = j;
}
else j = next[j];
}
}
下面是KMP算法实现:
int KMP(char* S, char* T, int pos)
{
int i=pos, j=1;
while (i<S[0] && j<T[0])
{
if (S[i] == T[j]){ ++i; ++j; }
else j = next[j]
}
if (j>T[0]) return i-T[0];
else return 0;
}
现在是朴素算法:
int Index(char *S, char *T, int pos)
{
int i=pos,j=1;
while(i <= S[0] && j<=T[0])
{
if (S[i] == T[j]) { ++i; ++j;} //如果相同,则继续向后比较
else {i = i-j+2; j =1;} //如果不同,就回溯,重新查找
}
if (j>T[0]) return i-T[0];
else return 0;
}