zoukankan      html  css  js  c++  java
  • KMP算法--Next数组原理、代码实现

    https://www.cnblogs.com/tangzhengyue/p/4315393.html  非常详细

    1. next数组的含义:

    KMP是在一个母字符串中查找一个子字符串的高效算法。它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。 

    KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符。当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大。

    2.next数组的求解方法

    第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。

    3.next数组实现

    void SetPrefix(char[] P, int prefix[])
    
    {
    
         int len=P.length;//模式字符串长度。
    
         prefix[0]=0;
    
         for(int i=1; i<len; i++)
    
         {
    
             int k=prefix[i-1];
    
             //不断递归判断是否存在子对称,k=0说明不再有子对称,Pattern[i] != Pattern[k]说明虽然对称,但是对称后面的值和当前的字符值不相等,所以继续递推
    
             while( Pattern[i] != Pattern[k]  &&  k!=0 )               
    
                 k=prefix[k-1];     //继续递归
    
             if( Pattern[i] == Pattern[k])//找到了这个子对称,或者是直接继承了前面的对称性,这两种都在前面的基础上++
    
                  prefix[i]=k+1;
    
             else
    
                  prefix[i]=0;       //如果遍历了所有子对称都无效,说明这个新字符不具有对称性,清0
    
         }
    
    }
    

      

  • 相关阅读:
    pyVmomi入门
    一个简单的web框架实现
    H3C交换配置PBR最佳实践
    jQuery入门第三
    jQuery入门第二
    JS笔记 入门第四
    JS笔记 入门第三
    JS笔记 入门第二
    day16
    python之路-DAY10
  • 原文地址:https://www.cnblogs.com/JohnTeslaaa/p/12422900.html
Copyright © 2011-2022 走看看