首页 > 其他 > 详细

KMP学习

时间:2015-08-14 13:05:04      阅读:156      评论:0      收藏:0      [点我收藏+]
刚才看了(连接写的翻译,把kmp算法的工作过程讲的很不错,kmp算法的核心是next,next为什么要那么赋值?其实就是前缀和后缀的最大匹配值,用这个值在匹配失败的时候可以跳过一个不必要的匹配。
 
移动的位数 = 已匹配的字符数 - 对应部分的匹配值(也就是前缀和后缀的最大相等值)。
为什么要这么移动呢?其实仔细想想也是可以明白的,首先必须明白被匹配的串是不会移动的,我们不会回去再重新匹配,所以只能移动模式串,模式前缀和后缀相等的很明显是可以不用在匹配了,比较感性的理解。
 
这是求next数组的函数

 

void FindNext(char s[], int next[])
{///因为匹配的时候当前不成功要找寻前面匹配成功的,所以当前保存前面的串,方便操作
    int j=-1, i=0, len = strlen(s);
    next[0] = -1;
    while(i < len)
    {
        if(j==-1 || s[i]==s[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}

 

 

 

KMP学习

原文:http://www.cnblogs.com/liuxin13/p/4729381.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!