next )
{
int len =
strlen(t) ;
int i, j = –1
;
next[0] = –1
;
//请读者自行思考i什么时候增长
for( i=1; i<len; ++
i )
{
//
i永远和j+1位的比较(因为j初始值为-1)
//如果失配就执行跳转。直到j为-1为止。
while( (j+1>0)&&(t[j+1]!=
t[i]) )
j =
next[j] ;
//如果匹配,则两个串的指针都增长
if( t[j+1]==
t[i] )
++
j ;
//
这句很抽象,意思是:
//
跳转的位置永远是匹配成功的下一位
//也是唯一给跳转表赋值的一句
next[i] = j+1
;
}
} //主函数:可以看出这个函数与上面的函数极其相似
int KMP_matcher( const char *s, const char *t, int
beg )
{
int l1 = strlen(s), l2 =
strlen(t) ;
int *next = new int
[l2] ;
KMP_prefix( t, next ) ;
int i, j = –1, ans =
beg ;
for( i=beg; i<l1; ++
i )
{
while( (j+1>0)&&(t[j+1]!=
s[i]) )
{
j =
next[j] ;
}
if( t[j+1]==
s[i] )
{
++
j ;
}
if( j+1==
l2 )
{
ans = i–l2+1
;
break
;
}
}
return
ans ;
}
转载于:https://www.cnblogs.com/microgrape/archive/2011/05/12/2043927.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110615.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...