KMP整理

kmp用于一一匹配问题,如字符串的匹配。

一遇到匹配问题,最初大家想到的就是循环一一对比匹配了,但是那样太慢,这就需要用到kmp了,

它就是很快的,用到最大公共前后缀

如ABCDABC这个串,我们匹配ABCDABTBCDABC这个长串,当匹配到第7个字符T的时候就不匹配了,用kmp我们就不用直接移到B开始再比一次,而是直接移到第5位来比较,这样可以减少时间

如果不懂可以去听大佬讲解的视频,https://www.bilibili.com/video/av11866460?from=search&seid=8737399042954538208

以下是记录公共前后缀数的数组

void kmpnext(char s[])
{
    int i=0,j=-1;
    int n=strlen(s); 
    ne[0]=-1;
    while(i<len)
    {
        if(j==-1||s[i]==s[j])
        {
            i++,j++;
            ne[i]=j;
        }
        else
          j=ne[j];
    }
}

以下是kmp的比较过程

int kmp(char *a,char *b)//匹配ab两串,a为父串
{
    int i=0,j=0;
    int len1=strlen(a);
    int len2=strlen(b);
    getnext(b);
    while(i<len1&&j<len2)
    {
      if(j==-1||a[i]==b[j])
        ++i,++j;
      else
        j=next[j];
//ABCDABTABCDABC
//ABCDABC
    }
    if(j==len2)
    return  i-j;
    else
        return -1;

}

 这里是相关习题https://www.cnblogs.com/ylrwj/p/11478327.html

包括

字符串的最大最小表示;
kmp模板;
扩展kmp;
posted @ 2019-09-10 17:34  蓉~  阅读(156)  评论(0编辑  收藏  举报