模式匹配-KMP算法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值