KMP算法

1.作用

用于字符串匹配,是一种改进的方法

2.原理

KMP算法的关键是根据给定的模式串Pattern,定义一个next数组。next数组包含了模式串本身局部匹配的信息,即保存中间子字符串从字符串开头匹配的最长公共前缀信息

3.操作过程

假设在模式匹配的进程中,执行S[i]和P[j]的匹配检查。若S[i]=P[j],则继续检查S[i+1]和P[j+1]是否匹配。若S[i]<>P[j],则分成两种情况:若j=1,则模式串右移一位,检查S[i+1]和P[1]是否匹配;若1<j<=m,则模式串右移j-next(j)位,即执行j=next[j]操作,检查S[i]和P[next(j)]是否匹配。重复此过程直到j=m或i=n结束。

4.代码实现

  1. //Preprocessing algorithm(计算前缀的函数)   
  2. void kmpPreprocess()  
  3. {  
  4.     int i=0, j=-1;//-1表示没有找到   
  5.     b[i]=j;  
  6.     while (i<m)//小于m是因为循环内先++,后赋值   
  7.     {  
  8.         while (j>=0 && p[i]!=p[j]) j=b[j];//j能取0是因为要从第0个字符比较   
  9.         i++; j++;  
  10.         b[i]=j;  
  11.     }  
  12. }   
  13. //Searching algorithm(字符串匹配模式搜索函数)   
  14. void kmpSearch()  
  15. {  
  16.     int i=0, j=0;  
  17.     while (i<n)  
  18.     {  
  19.         while (j>=0 && t[i]!=p[j]) j=b[j];//当j为-1时表示找不到   
  20.         i++; j++;  
  21.         if (j==m)  
  22.         {  
  23.             report(i-j);  
  24.             j=b[j];  
  25.         }  
  26.     }  
  27. }  
//Preprocessing algorithm(计算前缀的函数)
void kmpPreprocess()
{
    int i=0, j=-1;//-1表示没有找到
    b[i]=j;
    while (i<m)//小于m是因为循环内先++,后赋值
    {
        while (j>=0 && p[i]!=p[j]) j=b[j];//j能取0是因为要从第0个字符比较
        i++; j++;
        b[i]=j;
    }
} 
//Searching algorithm(字符串匹配模式搜索函数)
void kmpSearch()
{
    int i=0, j=0;
    while (i<n)
    {
        while (j>=0 && t[i]!=p[j]) j=b[j];//当j为-1时表示找不到
        i++; j++;
        if (j==m)
        {
            report(i-j);
            j=b[j];
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值