KMP算法实现

来源:互联网 发布:客户数据怎么划分 编辑:程序博客网 时间:2024/05/17 08:12
#include <stdlib.h>#include <stdio.h>#include <string>using namespace std;int * cover(string &pattern){    /*pattern = "abcdab"*/    int size = pattern.size();    int *p = new int[size];    int length = 0,r = size;    string str1;    if (!p)    {        printf("new error\n");        exit(1);    }    for (int i = 1;i < size+1; i++)    {        str1 = pattern.substr(0, i);        length = i - 1;        r = 1;        while (str1.substr(0,length) != str1.substr(r, length))        {            length--;            r++;        }        p[i - 1] = length;    }    return p;}int kmp(string &str, string &pattern){    int r = -1, i = 0;    unsigned int   pos;    int *p = cover(pattern);    int length = str.size() - pattern.size();    for (int m = 0; m < pattern.size(); m++)    {        printf("pattern[%d] = %4d\n", m, p[m]);    }    for (i; i < length; i++)    {        pos = 0;        while(pos < pattern.size())        {            if (str[i+pos] == pattern[pos])            {                pos++;            }            else            {                i += p[pos - 1];                break;            }        }        if (pos == (pattern.size() - 1))        {            delete[] p;            return r = i;        }    }    delete[] p;    return r;}int main(){    string str = "abcabcabdfg";    string pattern = "abcabd";    int pos = kmp(str, pattern);    printf("%d\n", pos);    return 0;}

0 0
原创粉丝点击