参数:原串和模式串
返回值:在原串中模式串的个数
可选:单个字符是否可以被重复使用于多个匹配中, 记录每一位0~i的前缀与模式串前缀的匹配长度
————————————————————————————————————————————————————————————
const int MAXN = 100000 ;
int nextLink[MAXN+100];
int numKMP[MAXN+100];
//KMP,返回匹配到模式串的个数
int xKMP(char * mOri, char * mPar)
{
int mP, mQ;
int mOriLen=strlen(mOri), mParLen=strlen(mPar);
//构造next数组
nextLink[0] = -1;
mP = 0, mQ = -1;
while ( mP<mParLen )
{
if ( mQ==-1 || mPar[mQ]==mPar[mP] ){
nextLink[++mP] = ++mQ;
}
else {
mQ = nextLink[mQ];
}
}
//kmp
mP = mQ = 0;
int mNum = 0;
while ( mP<mOriLen )
{
if ( mQ==-1 || mOri[mP]==mPar[mQ] ){
mQ++, mP++;
numKMP[mP-1] = mQ;//记录每一位0~i的前缀与模式串前缀的匹配长度
}
else{
mQ = nextLink[mQ];
}
if ( mQ==mParLen ){
mNum++;
/* mQ = 0;//不可重复使用字符*/
}
}
return mNum;
}