KMP算法综合学习

这周主要学习了KMP算法

简单来说呢,我觉得kmp算法就是两个部分,1是求next数组,2是用next数组

先说求next数组

首先next【i】数组代表的的意思是当第i位失配时,我的匹配串能跳转的最优位置,什么是最优位置呢,这就取决于第i位之前的字符串自身了


如果它存在这样的关系,这个图说明了很多,对后面next数组求得循环节问题也很有帮助

那么next【i】就应该指向P【k】所在得下标处

接下来就是算法实现了(注意得就是如果第一位就没能匹配成功,那就得特判一下,即都同时往后移动一位)

void getnext(int len)//只需要获得字符串的长度
{
    int i = 0,j = -1;//确定两个指向,寻找匹配串的next
    nex_t[0] = -1;
    while(i < len)
    {
        if(j == -1 || b[i] == b[j])//j = -1就是说已经指到头了还没有匹配,所以直接前跳就好了,没有发现匹配项
        {
            nex_t[++i] = ++j;
        }
        else
        {
            j = nex_t[j];
        }
    }
}
接下来就是使用next数组进行匹配了,这个相应得就好理解了,无非就是跳不跳,跳到哪得问题了

int kmp(int len1,int len2)
{
    int i = 0,j = 0;//匹配项和被匹配项都得从零开始
    while(i < len1 && j < len2)
    {
        if(j == -1 || a[i] == b[j])//j = -1表示第一个不匹配直接后移一位
            //因为跳跃只能控制j无法控制i所以用这个特判一下i可以往下跳动了
        {
            i++;j++;
        }
        else
        {
            j = nex_t[j];
        }
    }
    if(j == len2)
    {
        return i - j + 1;
    }
    else
    {
        return -1;
    }
}
最后得return是返回得出现的位置,i - j + 1为匹配成功时母串得位置所在~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值