今天总算是看懂了字符串匹配算法中的KMP,记下来吧,以后查的时候方便
失效函数:设模式 P=p 0p 1....p m-2p m-1, 则它的失效函数定义如下:
f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=p j-kp j-k+1...p j 的最大数
f(j)= -1 | 其它情况。
详细的不记了,把算法记下来。
下面是普通的匹配算法:
下面是 KMP 算法:
失效函数:设模式 P=p 0p 1....p m-2p m-1, 则它的失效函数定义如下:
f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=p j-kp j-k+1...p j 的最大数
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;
}