KMP

#include<iostream>
#include<string>
#include<vector>
//#include"vld.h"
using namespace std;

void getnext(int *next,const string &sub)
{
    int j = 1;
    int k = 0;
    next[1] = 0;
    next[0] = -1;
    int sublen = sub.size();
    while (j+1 < sublen)
    {
        if ((k == -1)|| sub[j] == sub[k])
        {
            next[++j] = ++k;
        }
        else
        {
            k = next[k];
        }
    }
}
int KMP(const string &str, const string &sub, int pos)
{
    int sublen = sub.size();
    cout << sublen << endl;
    int * next = new int[sublen];
    memset(next,0,sublen*sizeof(int));

    int i = pos;
    int j = 0;
    if (sublen > 1)
    {
        getnext(next, sub);
    }
    else
    {
        next[0] = -1;
    }
    while (i < str.size()&&j < sublen)
    {
        if ((j ==-1) || sub[j] == str[i])
        {
            ++i;
            ++j;
        }
        else
        {
            j = next[j];
        }
    }
    delete []next;
    if (j >= sublen)
    {
        return i - j;
    }
    else
    {
        return -1;
    }
}


int main()
{
    int pos = 0;
    while ((pos = KMP("ababcabcdabcde", "ab", pos))>=0)
    {
        cout << pos;
        pos += strlen("ab");
    }

    exit(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章