失效函数:设模式 P=p0p1....pm-2pm-1, 则它的失效函数定义如下:
f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=pj-kpj-k+1...pj 的最大数
f(j)= -1 | 其它情况。
j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
p | a | b | a | a | b | c | a | c |
f(j) | -1 | -1 | 0 | 0 | 1 | -1 | 0 | -1 |
void String::fail{
int lengthP=curLen;
f[0]=-1;
for(int j=1;j<lengthP;j++){
int i=f[j-1];
while(*(ch+j)!=*(ch+i+1)&&i>=0) i=f[i] ; //递推计算
if(*(ch+j)==*(ch+i+1))f[j]=i+1;
elsef[j]=-1;
}
}
int lengthP=curLen;
f[0]=-1;
for(int j=1;j<lengthP;j++){
int i=f[j-1];
while(*(ch+j)!=*(ch+i+1)&&i>=0) i=f[i] ; //递推计算
if(*(ch+j)==*(ch+i+1))f[j]=i+1;
elsef[j]=-1;
}
}
int String::find(String &pat) const{
char*p=pat.ch; *s=ch; int i=0;
if(*p && *s)
while(i<=curLen-pat.curLen)
if(*p++==*s++){ // C++的精典之处
if(!*p) return i;
}
else { i++; s=ch+i; p=pat.ch; }
return -1;
}
char*p=pat.ch; *s=ch; int i=0;
if(*p && *s)
while(i<=curLen-pat.curLen)
if(*p++==*s++){ // C++的精典之处
if(!*p) return i;
}
else { i++; s=ch+i; p=pat.ch; }
return -1;
}
int String::fastFind(String &pat) const {
int posP=0 , pasT=0 ;
int lengthP=pat.curLen, lengthT=curLen;
while(posP<lengthP && posT< lengthT)
if(pat.ch[pasP]==ch[posT]{
posP++; posT++ ;
}
else if (posP==0) posT++ ;
else posP=pat.f[posP-1] + 1 ;
if(posP<lengthP) return -1 ;
else return posT-lengthP;
}
int posP=0 , pasT=0 ;
int lengthP=pat.curLen, lengthT=curLen;
while(posP<lengthP && posT< lengthT)
if(pat.ch[pasP]==ch[posT]{
posP++; posT++ ;
}
else if (posP==0) posT++ ;
else posP=pat.f[posP-1] + 1 ;
if(posP<lengthP) return -1 ;
else return posT-lengthP;
}