博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP算法的C++实现
阅读量:6851 次
发布时间:2019-06-26

本文共 2215 字,大约阅读时间需要 7 分钟。

这个问题阮一峰老师讲的很清楚,

这里我只贴一下我的C++实现代码:

#include 
#include
#include
#include
#include
using namespace std;void BuildPatchMatchTable(int *partMatchTable, char *findstr){ if(findstr == NULL) return; partMatchTable[0] = 0; int sizefind = strlen(findstr); for(int i = 1; i < sizefind; ++i) { set
preset; string tmppre = ""; tmppre = findstr[0]; preset.insert(tmppre); for(int j = 1; j < i; ++j) { tmppre = tmppre + findstr[j]; preset.insert(tmppre); } set
postset; string tmppost = ""; tmppost = findstr[i]; postset.insert(tmppost); for(int j = i - 1; j > 0; --j) { tmppost = findstr[j] + tmppost; postset.insert(tmppost); } set
comset; for(set
::iterator beg = preset.begin(); beg != preset.end(); ++beg) { if(postset.count(*beg) > 0) comset.insert(*beg); } int maxlen = 0; for(set
::iterator beg = comset.begin(); beg != comset.end(); ++beg) { if((*beg).size() > maxlen) maxlen = (*beg).size(); } partMatchTable[i] = maxlen; }} int kmp(char *srcstr, char *findstr){ if(srcstr == NULL || findstr == NULL) return -1; int lensrc = strlen(srcstr); int lenfind = strlen(findstr); int *partMatchTable = new int[lenfind]; BuildPatchMatchTable(partMatchTable, findstr); for(int i = 0; i < lenfind; ++i) cout << findstr[i] << "\t" << partMatchTable[i] << endl; int curFind = 0; for(int i = 0; i < lensrc; ) { if(findstr[curFind] == srcstr[i]) { ++i; ++curFind; } else { if(curFind == 0) ++i; else { int movestep = curFind - partMatchTable[curFind-1]; i += movestep; curFind = 0; } } if(curFind == lenfind) { delete []partMatchTable; return i - lenfind; } } return -1; delete []partMatchTable;}int main(){ char srcStr[] = "bbc abcdab abcdabcdabde"; char findStr[] = "abcdabd"; cout << "pos:" << kmp(srcStr, findStr) << endl; char srcStr2[] = "bbc abcdab abcdabcdabdezzz"; char findStr2[] = "zzz"; cout << "pos:" << kmp(srcStr2, findStr2) << endl; char srcStr3[] = "bbc abcdab abcdabcdabde"; char findStr3[] = "zzz"; cout << "pos:" << kmp(srcStr3, findStr3) << endl;}

 

关键问题

1. 求出部分匹配值表

2. 移动次数= 已匹配个数 - 最后一个匹配的字符的部分匹配结果

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3633700.html,如需转载请自行联系原作者

你可能感兴趣的文章
Spring常用注解
查看>>
哥德巴赫猜想算法c#实现方法
查看>>
MongoDB---管理简析
查看>>
我的友情链接
查看>>
solr5.2.1-----环境搭建
查看>>
Tomcat源码学习(二)--Tomcat_7.0.70 启动分析
查看>>
MYSQL备份恢复
查看>>
linux启动_grub
查看>>
MyBatis的常见属性总结select、insert、update、delete
查看>>
运行脚本下的 类tail -f sed -n
查看>>
[Python]学习基础篇:字典
查看>>
观察者模式
查看>>
Android WebView缓存机制详解
查看>>
Linux iptables命令高级网络
查看>>
STL中mem_fun和mem_fun_ref的用法
查看>>
Mysql管理总结
查看>>
Exchange2007的规划和安装
查看>>
同步时间
查看>>
去除TFS版本控制信息
查看>>
南海区妇幼保健院HIS数据容灾备份系统项目
查看>>