算法与数据结构-KMP算法

        定义主串为src,子串(模式)为sub,简单讲KMP算法就是在比较src[i]与sub[j]时,若匹配失败,不回溯i,而是根据j=next(j)来调整j的值继续与i比较。
next(j)函数值根据sub前k个字符与到j-1为止的后k个字符相等的最大k值来确定。

if(j==0) next[j]=-1;
else if(k≠∅) next[j]= MAX{ k | 0≤k<j 且 sub[ 0……k-1 ] = sub[ j-k……j-1 ] } ;
else next[j]=0;


给出个人的一段匹配代码:

/**
 * KMP模式匹配 返回匹配成功的索引 失败则返回-1
 * src:主串
 * sub:子串(模式)
 * next:模式定位的next值
 */
int indexByKMP(char src[],char sub[],int next[]){
    int i=0,j=0,srcLen=strlen(src),subLen=strlen(sub);
    while(i<srcLen && j<subLen){
        if(j<0||src[i]==sub[j]){ i++;j++; }
        else j=next[j];
    }
    if(j>=subLen)return i-subLen;
    return -1;
}


初始化next的代码如下:

/**
 * 初始化next
 * sub:子串(模式)
 * next:模式定位的next值
 */
void initNext(char sub[],int next[]){
    int i=0,j=-1,len=strlen(sub);
    next[0]=-1;
    while(i<len){
        if(j==-1||sub[i]==sub[j]){ i++;j++;next[i]=j; }
        else j=next[j];
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值