KMP字符串匹配算法

详情参见《数据结构(c语言版)》严蔚敏著 Page80

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getnext(int next[], char * string)
{
    int i = 1;
    int j = 0;
    next[1] = 0;
    while(i <= string[0])
    {
        if(j == 0 || string[i] == string[j])
        {
            i++;
            j++;
            if(string[i] != string[j]) next[i] = j;
            else next[i] = next[j];
        }
        else
            j = next[j];
    }
}
int KMP(char * s, char * p, int pos,const int next[])
{
    int i = pos;
    int j = 1;
    while(i <= s[0] && j <= p[0])
    {
        if(j == 0 || s[i] == p[j])
        {
            i++;
            j++;
        }
        else
            j = next[j];
    }
    printf("%d\n",j);
    if(j > p[0]) return i - p[0];
    return -1;

}
int main()
{
    char p[10] ={"4aabb"};
    char s[9] ={"7aabaabb"};
    int next[9];
    next[0] = 100;
    p[0] = 4;
    s[0] = 7;
    getnext(next,p);
    int i = 0;
    for(;i<=p[0];i++)   printf("%d ",next[i]);
    putchar('\n');
    printf("%d\n",KMP(s,p,1,next));
    return 0;
}

posted @ 2011-09-22 02:56  dc0453  阅读(132)  评论(0)    收藏  举报