• kmp算法


      kmp算法,就是模式串匹配算法,但又不同于BF算法的。它和BF算法之间的最大区别在于,kmp算法在匹配前会对目标串进行一定的处理。会用到一个next数组用来存放,在匹配时第i个字符失配时应将目标串移动多少位。而第i个字符的next值时由前i-1个字符组成的字符串决定的。因为,第i个字符的next值是前i-1个字符组成的字符串的最大的相同前缀与后缀的字符数之和,所以next[0]=-1。在匹配的过程中,模式串中的指针不会回溯,而目标串中的指针的回溯是根据第i个失配字符的next值所决定的。

      求next函数的模板

      

    void get_next(char T[], int next[])
     {
      // 求模式串T的next函数值并存入数组 next。
      j = 0; next[0] = -1; k = -1;
      while ( T[j+1] != '' ) {
      if (k = = -1 || T[j] = = T[k])
       { ++j; ++k; next[j] = k; }
      else k = next[k];
      }
     } // get_next

    因为在S[i]和T[j]不等时,由于T[j]=T[k],则S[i]肯定也不等于T[k],也就是说,S[i]不应该再去和T[k]进行比较(因为纯粹是多余的),而应该直接和T[next[k]]进行比较。因此,当T[j]=T[k]时,应该直接取T[k]的next函数值作为T[j]的 next 函数值。

    void get_nextval(char T[], int next[])
     {
      // 求模式串T的next函数值并存入数组 next。
      j = 0; next[0] = -1; k = -1;
      while ( T[j+1] != '' ) {
       if (k = = -1 || T[j] = = T[k]) {
        ++j; ++k;
        if (T[j]!=T[k]) next[j] = k;
        else next[j] = next[k];
       } // if
       else k = next[k];
      } // while
     } // get_nextval

      kmp比较函数

       while(i<len_a&&j<len_b)
        {
            if(j==-1||a[i]==b[j])
            {
                i++;
                j++;
            }
            else
                j=next[j];
        }

  • 相关阅读:
    激活
    年龄校验,精确到日
    腾讯消息队列CMQ一键化部署脚本
    腾讯消息队列CMQ部署与验证
    蓝鲸6.0.1部署
    docker离线安装
    蓝鲸平台开启consul.conf UI界面
    基于docker一键化部署LNMP环境
    阿里云镜像上传打包
    腾讯蓝鲸平台部署[5.1.29版本]
  • 原文地址:https://www.cnblogs.com/hbutACMER/p/3872384.html
Copyright © 2020-2023  润新知