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

KMP算法C++实现

2014-12-22 21:57 330 查看
KMP算法事模式匹配的高效算法,代码很少,但是却不是很容易理解。这几天刚好做了一些这方面的调研,写了一个C++实现版本的KMP算法,贴出来亮亮。

其实KMP算法最重要的部分是next数组的计算方法,这里有一篇讲解得非常到位的文章/article/6414353.html.

而再计算完next数组之后实现模式的匹配就简单多了,基本得策略与计算next数组得方法是一致的。好了不多说了,贴代码。

#ifndef HelloWorld_KMP_h
#define HelloWorld_KMP_h
class KMP
{
public:
KMP()
{
}
/*
*str原始字符串
*需要查找的字符串
*/
int findSubstr(char *str,char* pattern)
{
int *next = new int[strlen(pattern)];
getNext(pattern,next);
int i=0;
int len = (int)strlen(str);
int j = 0;
while(i<len)
{
if(j==-1||pattern[j]==str[i])
{
i++;
j++;
}
else
{
j = next[j];
}
if(j==strlen(pattern))
{
delete[] next;
return i-(int)strlen(pattern);
}
}
if(j==strlen(pattern))
{
delete[] next;
return j-(int)strlen(pattern);
}
delete[] next;
return -1;
}
int strStr(char *haystack, char *needle) {
if(needle==nullptr||haystack==nullptr)
return -1;
int *next = new int[strlen(needle)];
getNext(needle,next);
int i=0,len = (int)strlen(haystack),j= haystack[0]==needle[0]?0:-1;
int nLen = (int)strlen(needle);
while(i<len)
{
if(j==-1||needle[j]==haystack[i])
{
i++;
j++;
}
else {
j = next[j];
}
if(j==nLen)
return i-nLen;
}
return -1;
}
private:
void getNext(char* pattern,int next[])
{
int i=0;
int j= -1;
next[0]=-1;
int len = (int)strlen(pattern);
while(i<len)
{
if(j==-1||pattern[i]==pattern[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
};

#endif


测试代码如下:

#include <iostream>
#include "KMP.h"
using namespace std;
int main(int argc, const char * argv[]) {
// insert code here...
KMP kmp;
cout<<kmp.strStr((char*)"worljackorldworldhello", (char*)"world")<<endl;
cout<<kmp.findSubstr((char*)"world", (char*)"world")<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: