您的位置:首页 > 其它

9.KMP模式匹配算法实现o(n)复杂度的匹配

2014-04-16 22:44 579 查看
#include<stdio.h>

#define MAXSIZELEN 255
typedef  unsigned char  SString[MAXSIZELEN + 1];

void InitSString(SString &A, char *a)
{
int i = 1, j = 0;
while (i < MAXSIZELEN && a[j])
{
A[i++] = a[j++];
}
A[i] = '\0';
A[0] = j;
}
void OutputSString(SString &A)
{
printf("%s\n",A+1);
}

int next[MAXSIZELEN];

void get_next(SString T)//, int next[])
{
int i = 1; next[1] = 0; int j = 0;
while (i < T[0])
{
if (j == 0 || T[i] == T[j])
{
++i; ++j;
next[i] = j;
}
else j = next[j];
}
}

int Index_KMP(SString S, SString T, int pos)
{//s为主串  t为模式串
int i = pos;
int j = 1;
//int next[MAXSIZELEN];
get_next(T);//, next);
while (i <= S[0] && j <= T[0])
{
if (j == 0 || S[i] == T[j])
{
++i; ++j;
}
else j = next[j];
}
if (j > T[0]) return i - T[0];
else return 0;
}
//by zhaoyang 2014.4.16
int main()
{
SString a,b;
InitSString(a, "abcbaaabcccac=bacabaabcaacabaabcac");
printf("主串( %d ):\n",a[0] );
OutputSString(a);
InitSString(b, "abaabcac");
printf("模式串(%c):\n",b[0]+48);
OutputSString(b);
printf("下面是经典的KMP算法---------的结果:\n");
int t=Index_KMP(a, b, 1);
printf("匹配位置就是 :-------   %d   ------\n"  ,t);
printf("next数组:\n");
for (int i = 1; i <= b[0]; i++) printf("%d  ", i);  putchar(10);
for (int i = 1; i <= b[0]; i++) printf("%d  ", next[i]);  putchar(10);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: