KMP理解

KMP真的不容易

KMP思想很简单

KMP的next数组真难理解

其实next数组的形成就是自己和自己进行比对,其主要思想就是KMP自己
代码:

int main()
{
    string s = "abaabcabaaba";
    vector<int> next(s.size());
    next[0] = -1;
    //j就是对比的位置
    int j = 0;
    //i就是s的位置
    int i = 1;
    while (i < s.size() - 1)
    {
    	//如果s[i]==s[j],也就是说明在s[i+1]之前的i+1个字符里面
    	//最大的前后缀子串的大小是j+1,这代表着什么呢?代表着如果
    	//在s[i+1]时候和s[j+1]匹配不成功的时候,就可以把最大子串
    	//拉到后面来进行匹配计算,因为前后子串是一样的,所以就可以
    	//不用对比子串了。
        if (s[i] == s[j])
        {
            next[i + 1] = j + 1;
            i++;
            j++;
        }
        //如果s[i]!=s[j],那就让j=next[j],因为前面说了,如果不相
        //等,因为又是自己对自己的KMP,所以next数组的前面部分已经
        //存储了如果匹配失败应该后移多少的信息,所以就可以这么计算,
        //但是当j=0的时候,就说明根本就不会有匹配的了,所以如果匹
        //配失败,那就只向后移动i就行了。如果匹配成功,那么就把
        //next[i+1]=j+1就行了,因为j=0,因为匹配成功,所以j+1=1
        //表示有一个已经是最大前后子串了。
        else
        {
            if (j == 0)
            {
                next[i + 1] = 0;
                i++;
            }
            else
                j = next[j];
        }
    }
    for (int k = 0; k < next.size(); k++)
        cout << next[k] << ",";
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值