您的位置:首页 > 其它

该死的KMP

2008-11-18 01:46 176 查看
这KMP简直不是人想出来的。

搞了一个晚上才照着书本把KMP代码敲出来,太笨了。代码如下,不想解释。
这是参照算法导论搞的。不想搞这个鬼东西,搞起来要命!
//////////////////////////////////////////////////////////////////////////
// KMP
// KMP算法 c语言实现
//////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;

void findNext(char *pattern, int next[])
{

int len = 0;
int q,k;

if(NULL == pattern)
return;
q = 1,k = -1;
next[0] = -1;
len = strlen(pattern);
for(q = 1; q < len; q++)
{
while(k >= 0 && (pattern[k + 1] != pattern[q]))
k = next[k];

if(pattern[k + 1] == pattern[q])
k++;
next[q] = k;

}
}

char* KMP(char *source, char *pattern)
{
int position;
int *next;
int q = 0, i = 0;
int strlenSource = strlen(source);
int strlenPattern = strlen(pattern);

if(NULL == source || pattern == NULL)
return NULL;

next = (int*)malloc(sizeof(int) * strlen(pattern));
findNext(pattern,next);
q = -1;
i = 0;
for(; i < strlenSource; i++)
{
while(q >=0 && (pattern[q + 1] != source[i]))
{
q = next[q];
}
if(pattern[q + 1] == source[i])
{
q++;
}
if(q == (strlenPattern - 1))
{
return &source[i - q];
}
}
free(next);
return NULL;
}

int main()
{
char source[] = "hello my boy! i love you so much,and you?evil eve evil. I am sorry i am not a gay!";
char pattern[] = "evil eve evil";
char pattern2[]= "ababababca";
char source2[] = "abcbcababababcafabcbcbcabcabcee";
char *rs = NULL;
rs = KMP(source, pattern);
if(rs)
cout << rs << endl;

rs = KMP(source2, pattern2);
if(rs)
{
cout << rs <<endl;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: