kmp算法(模板)

KMP 算法的关键在于初始化next[ ] 数组

void getnext(char *b)

{

         int  len=strlen(b); / / 待匹配字符串的长度

         next[0]=next[1]=0; / /初始化第一个数和第二个数

         for(int  i = 1; i < len ; i++){

                   int  j=next[i] ; / / 用 j 来记录每次匹配失败返回的位置

                   while ( j && b[i] ! =b[j] )

                    j = next[ j ]; / / 往前寻找相同字符,返回位置

                    next[ i + 1 ] = b[i]==b[i+1] ? j+1: 0; / / 如果找到与当前匹配字符相等的位置,在此位置+1

                                                                           / / 否则从0 开始匹配

           }

}

有了 next[ ] 数组 KMP 函数就很容易了

int    KMP(char *a  , char * b){

         getnext();

         int   l1=strlen(a), l2=strlen(b); / / l1为匹配字符串长度 ,l2为待匹配字符串长度

         int   i , j =  0, ans=0;  / / j 用来记录匹配长度

         for(int i=0 ;i< l1; i++){

                          while ( j && a[i] ! = b[j] )

                                    j = next [j] ;   / / 若匹配失败,查找next[ ] 数组,返回重新匹配

                                    if ( a[i] == b[j]) j++;  / / 匹配个数 

                                    if ( j == l2 )  break;

            }

 

            if( j == l2) return i - l2 + 2; / /  若找到返回找到的位置

             else  return  -1;  / / 若没有找到返回 -1

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值