zoukankan      html  css  js  c++  java
  • 学习KMP算法

    int kmp(char * t,int lenT,char * pat,int lenPat){
        int posP=0,posT=0;
        int[] f=partialMatch(pat,lenPat)//获取pat字符串的部分匹配数组 
        while(posP<lenPat && posT<lenT){ 
          if(pat[posP]==t[posT]){
            posT++;
            posP++;
          }
          else if(posP==0) posT++;//第一就不匹配,目标字符串向后移动 
          else posP=f[posP-1]+1;//前面都匹配,则将搜索字符串,直接移动到未比较过的位置                                                   
        }        
        if(posP<lenPat)return -1;//如果posP没有遍历完搜索字符串,则说明没有找到 
        else return posT-lenPat; //找到了,则返回在目标字符串中的起始位置 
    }
    
    /*递推方法: 
    f[j]=k,str[0:k-1]== str[j-k:j-1],这是从str[0:j-1]中找到其前缀子串集合和其后缀子串集合的交集中的最大子串。 
    
    假设 f[j]=k,即str[0:k-1]==str[j-k:j-1]
    如果 str[k]== str[j] => str[0:k]==str[j-k:j] => f[j]=k+1
    如果 str[k]!=str[j] => 
      如果找到最大整数 h,满足str[0:h-1]==str[k-h:k-1],即f[k]=h,也就是说str[0:k-1]中存在一个最大子串str[0:h-1], 
      然后判断str[h+1]与str[j]是否相等,如果不等,再从str[0:h-1]子串中去找到最大子串,然后再去判断 
      如果找不到 最大子串, 则f[j+1]=-1
    
    */ 
    int[] partialMatch(char * s,int len){
        int[] f=new int[len];
        f[0]=-1;//递推种子 
        for(int j=0;j<len-1;j++){
            int k=f[j];
            while(k>=0 && *(s+j+1)!=*(s+k+1))
                k=f[k]; //判断是否有子串符合 *(s+j)==*(s+k+1),如果不等,从子串中继续找最大子串。 
            if(*(s+j+1)==*(s+k+1)) 
                f[j+1]=k+1; 
            else 
                f[k]=-1;
        }
    }

    一直都没看懂,直到看了这篇文章:http://kb.cnblogs.com/page/176818/

  • 相关阅读:
    机器学习之路--Python
    机器学习之路--Pandas
    机器学习之路--seaborn
    机器学习之路--Matplotlib
    囫囵吞枣——SVG
    囫囵吞枣——XML
    囫囵吞枣——Jquery 笔记
    囫囵吞枣——JavaScript
    囫囵吞枣——CSS3
    囫囵吞枣——CSS笔记
  • 原文地址:https://www.cnblogs.com/xsauce/p/3783965.html
Copyright © 2011-2022 走看看