字符串匹配算法

By | 2015-09-04
前缀匹配
KMP算法
KMP算法与蛮力算法的不同之处在于蛮力算法模式串每次向前+1,而KMP每次向前+K。
jump K中的K可以通过预先计算模式串得出。jump[j]=k表示满足P[0,K] = P[J-K,J]的最大K值
那么kmp算法大致便是:
int j=0;
for (int i=0;i<n;i++){
     while(j>0&&P[j+1]!=T[i]){
          j = jump[j];
     }
     if(P[j+1]==T[i]) j++;
     if(j==m){
          print i-m;
     }
}
计算jump:
jump[0] = 0;
j=0;
for(int i=1;i<m;i++)
{
     while(j>0&&P[j+1]!=P[i]) j = jump[j];
     if(P[j+1]=P[i]) j++;
     jump[i] = j;
}
KMP最差时间复杂度是O(N),最好是O(N/M)