#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);
}
KMP
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.