第四章(串) 【KMP算法】

目标:掌握kmp算法,并更改成更方便使用的算法代码模版


//-----生成一个其值等于chars的串T-----
Status StrAssign(SString T, char *chars) { //生成一个其值等于chars的串T
int i;
if (strlen(chars) > MAXSTRLEN)
return ERROR;
else {
T[0] = strlen(chars);
for (i = 1; i <= T[0]; i++)
T[i] = *(chars + i - 1);
return OK;
}
}


//-----KMP算法-----
int Index_KMP(SString S,SString T,int pos){//利用next函数求模式串T在主串S第pos个字符之后的位置
i=pos;j=1;
while(i<=S[0]&&j<=T[0]){
if(j==0||S[i]==T[j]){++i;++j;}
else j=next[j];
}
if(j>T[0]) return i-T[0];
else return 0;
}


//-----计算next函数值-----
void get_next(SString T,int next[]){
i=1;next[1]=0;j=0;
while(i<T[0]){
if(j==0||T[i]==T[j]){++i;++j;next[i]=j;}
else j=next[j];
}

}


T与chars相比T[0]存储的是字符串长度。这里将其改成适合acm的KMP算法模板代码

#include<cstdio>
#include<cstring>
int next[1010]; 
int count;
char s[1010],p[1010];

void get_next(char* p){ 
    int i=0,j,len=strlen(p);
    next[0]=j=-1;
    while(i<len-1){
        if(j==-1||p[i]==p[j]){
            ++i,++j;
            next[i]=j;
        }
        else
            j=next[j];
    }
}

int kmp(char* s,char* p){
    int i=0,j=0,len1=strlen(s),len2=strlen(p);
    while(i<len1){
        if(s[i]==p[j]||j==-1){
            i++,j++;
        }
        else{
            j=next[j];//加速过程
        }
        //if(j==len2)
            //count++;
        if(j==len2)//返回str第一次出现的下标
            return i-len2;
    }
    //return count;//返回模式串出现的次数k 
} 
                    
     
int main(){
    while(scanf("%s %s",s,p)!=EOF){
        get_next(p);
        printf("%d\n",kmp(s,p));
    }
    return 0;
}
     




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值