多模式匹配AC算法(更正)
2016-05-25 15:07
381 查看
在上一篇关于多模式匹配AC的算法中,有一点失误的地方,在这里更正一下。
上篇中的运行结果如下:
![](https://img-blog.csdn.net/20160525151647542?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
不仔细看完全没有问题,可是如果细心的你仔细看下对字符串“hao”的匹配的下标时就会发现问题了...
下图为更正代码后的结果:
![](https://img-blog.csdn.net/20160525151932625?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
经过两个图片的对比,应该很明显了吧。
废话不多说,以下是需要更改的函数的代码:
上篇中的运行结果如下:
不仔细看完全没有问题,可是如果细心的你仔细看下对字符串“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; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析