【字符串】【kmp模板】

s1为匹配串,s2为模式串。kmp算法中的next数组称为失配指针,表示s1[i]和s2[j]匹配失败时,最有效率的方法是让s1[i]和s2[j]中的哪个元素进行匹配。
next数组有很多种定义方式,自己选了一种作为模板。
比如: a b c d a b c
i == : 0 1 2 3 4 5 6
next:-1 0 0 0 0 1 2
当匹配到i=6,出现失配时,next数组回溯到i=2的位置

void get_next()
{//next数组保存了以i结尾的字符串的最长公共前缀和后缀的起始坐标
    int i,j;
    next[0] = j = -1;
    i = 0;
    while(i < l2)
    {
        while(j!=-1&&str2[j]!=str2[i])//自身和自身进行匹配
            j = next[j];
        next[++i] = ++j; 
    }
}
int kmp()
{
    int i,j;
    i = j = 0;
    while(i < l1&&j<l2)
    {
        while(j!=-1&&str1[i]!=str2[j])
        {
            j = next[j];
        }
        i++;
        j++;

    }
    if(j == l2)
        return i-j;//完全匹配时的开始下标,下标从0开始
    return -1;//不存在匹配情况 
}
int kmp()
{
    int i,j;
    i = j = 0;
    while(i < l1)//注意和返回下标的区别
    {
        while(j!=-1&&str1[i]!=str2[j])
        {
            j = next[j];
        }
        if(j == l2-1)
        {
           ans ++;
           j = next[j];
        }
        i++;
        j++;
    }
    return ans;//返回匹配次数 
}
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/hello_sheep/article/details/76889545
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞