码迷,mamicode.com
首页 > 编程语言 > 详细

kmp算法模板及理解

时间:2016-03-30 23:56:55      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

kmp算法是复杂度为O(n+m)的字符串匹配算法;

首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度;

这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢?

因为只有这样才能一边避免可能漏掉的位置,一边尽量不重复已经匹配的位置;

getNext的函数:

void getNext()
{
    int k = -1,j = 0,len = strlen(str);
    next[0] = -1;
    while(j < len)
    {
        if(k == -1||str[j] == str[k])
        {
            j++;
            k++;
            next[j] = k;//相等的话就往后继续;
        }
        else k = next[k];//不等的话就相当于kmp一样,把模式串的这个子串用已经求出来的next跳转;
    }
}

kmp算法代码:

int kmp()
{
    int posP = 0,posT = 0;
    int lenP = strlen(strP),lenT = strlen(strT);
    while(posP < lenP&&posT < lenT)
    {
        if(posP == -1||strP[posP] == strT[posT])
        {
            posP++;
            posT++;
            
        }
        else posP = next[posP];
        if(posP == lenP)return posT-lenP;//匹配成功返回匹配成功的位置;
    }
    return -1;//匹配失败哦;
}

 

kmp算法模板及理解

标签:

原文地址:http://www.cnblogs.com/zhangchengc919/p/5339369.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!