在上一篇关于多模式匹配AC的算法中,有一点失误的地方,在这里更正一下。
上篇中的运行结果如下:
不仔细看完全没有问题,可是如果细心的你仔细看下对字符串“hao”的匹配的下标时就会发现问题了...
下图为更正代码后的结果:
经过两个图片的对比,应该很明显了吧。
废话不多说,以下是需要更改的函数的代码:
int searchAC(Tree root,char *str,int len)
{
TreeNode *tmp=root;
int i=0;
while(i<len)
{
int pos=str[i]-'a';
if(tmp->next[pos] != NULL)
{
tmp=tmp->next[pos];
if(tmp->patterTag==1) //如果为接收态
cout<<i-strlen(pattern[tmp->patterNo])+1<<'\t'<<tmp->patterNo<<'\t'<<pattern[tmp->patterNo]<<endl;
i++;
}
else
{
if(tmp==root)
i++;
else
{
tmp=tmp->fail;
if(tmp->patterTag==1) //如果为接收态
cout<<i-strlen(pattern[tmp->patterNo])<<'\t'<<tmp->patterNo<<'\t'<<pattern[tmp->patterNo]<<endl;
}
}
}
while(tmp != root)
{
tmp=tmp->fail;
if(tmp->patterTag==1) //如果为接收态
cout<<i-strlen(pattern[tmp->patterNo])<<'\t'<<tmp->patterNo<<'\t'<<pattern[tmp->patterNo]<<endl;
}
return 0;
}