您的位置:首页 > 编程语言 > C语言/C++

多模式匹配AC算法(更正)

2016-05-25 15:07 381 查看
在上一篇关于多模式匹配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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息