您的位置:首页 > 其它

kmp 算法实现

2013-08-19 16:54 113 查看
/*=================
kmp 算法实现
2013-08-19 By Mei
=================*/

#include <iostream>
#include <cstring>
using namespace std;

int *find_next(char *b)
{
int len = strlen(b);
int *next = new int[len];
next[0] = -1;
for(int i=1; i<len; ++i)
{
int index = next[i-1];
while(b[index+1]!=b[i])
{
index = next[index+1];
if(index==-1)
break;
}
if(b[i] == b[index+1])
{
next[i] = index + 1;
continue;
}
else
next[i] = -1;
}
return next;
}

int kmp_find(char *a, char*b, int *next)
{
int len_a = strlen(a);
int len_b = strlen(b);
int array_b = 0;
for(int i=0; i<len_a; ++i)
{
if(a[i] == b[array_b])
array_b++;
else
{
if(array_b==0)
continue;
else
array_b = next[array_b-1]+1;
}

if(array_b == len_b)
return i-array_b+1;
}
return -1;
}

void print(int *a, int n)
{
for(int i=0;i<n;++i)
cout<<a[i]<<" ";
cout<<endl;
}

int main()
{
char a[] = "abcabcababc";
char b[] = "abab";
int *test;
test = find_next(b);
print(test, strlen(b));
int x =  kmp_find(a, b, test);
cout <<x <<endl;
delete [] test;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: