正文t, 模式p, 失败链接flink
算法概述:
在匹配过程中,一旦出现p[j] != t[i] ;
如果存在一个整数k (k < j),
使得在模式p中开头的k个字符(p[0], p[1], ..., p[k-1])依次与p[j]前面k个字符(p[j-k], p[j-k+1],...p[j-1])相同,
那么只要从模式p中的p[k]开始与正文t的t[i]开始继续进行比较,
就可以省去前面k词比较。
如果满足上面条件的k有多个,取最大k。
?
void faillink(char* p, int isize, int* flink)
{
int j, k;
flink[0] = -1;
j = 1;
while (j < isize)
{
k = flink[j - 1];
while (k != -1 && p[k] != p[j-1])
k = flink[k];
flink[j++] = k + 1;
}
}
int kmp_match(char* t, int tsize, char* p, int psize, int* flink)
{
int tidx, pidx;
tidx = 0;
pidx = 0;
while (tidx < tsize)
{
while (pidx != -1 && p[pidx] != t[tidx])
pidx = flink[pidx];
if (pidx == psize - 1) return (tidx - psize + 1);
tidx ++;
pidx ++;
}
return -1;
}