模式匹配-KMP算法

来源:互联网 发布:冰与火之歌淘宝 编辑:程序博客网 时间:2024/04/29 03:11

 正文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;
}