zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    练习题
    练习
    2.15
    数组
    java聊天工具12.4
    11.13(2)
    11.13
    10.30 作业
    10.23
    面向对象
  • 原文地址:https://www.cnblogs.com/ylrwj/p/11498736.html
Copyright © 2011-2022 走看看