串的模式匹配KMP算法



#include<iostream>
using namespace std;




typedef struct
{
char*ch;
int length;
}SString;
int Ass(SString &H,char *sh){
int i=0;
while(sh[i]) i++;
H.ch=(char*)malloc((i+1)*sizeof(char));
H.length=i;
    for(i=1;i<=H.length;i++)
H.ch[i]=sh[i-1];
return 0;
}
int Next(SString S,int * next){
int i=1,j=0;
next[1]=0;
while(i<=S.length)
{
if(j==0||S.ch[i]==S.ch[j]){i++;j++;next[i]=j;}
else j=next[j];
}
return 0;
}
int KMP(int *next,SString S,SString H){
int j=1,i=1;
while(i<=S.length&&j<=H.length){
if(S.ch[i]==H.ch[j]){i++;j++;}
else{ 
if(!next[j]) i++;
else j=next[j];
}
}
if(j>H.length) cout<<"success";
else cout<<"fail";
return 0;
}
int main(){
SString H,S;
char*a="beijing";
Ass(H,a);
int i=1;
while(i<=H.length)
{cout<<H.ch[i];i++;}
cout<<endl;
char*b="jing";
Ass(S,b);
i=1;
while(i<=S.length)
{cout<<S.ch[i];i++;}
cout<<endl;
int *next;
next=(int*)malloc((S.length+1)*sizeof(int));
Next(S,next);
KMP(next,H,S);
cout<<endl;
return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值