#include <iostream>
#include <string.h>
using namespace std;
int* next = NULL;
void initNext(const char* substr)
{//得到next数组
int len = strlen(substr);
next = new int[len+1];
next[0] = len;
if(len < 1)
return;
next[1] = 0;
if(len < 2)
return;
next[2] = 1;
int k,j ;
for(j = 3; j <= len;j++)
{
k = next[j - 1];
if(substr[k - 1] == substr[j-1-1])
next[j] = k+1;
else
next[j] = 1;
}
}
void destroyNext()
{
delete []next;
}
void printNext(int *next)
{
for(int i = 1;i<=next[0];i++)
{
cout<<next[i]<<' ';
}
cout<<endl;
}
int kmp(const char* str,const char* substr)
{
initNext(substr);
int len = strlen(str);
int sublen = strlen(substr);
if(sublen > len)
return -1;
int i,j;
i = j = 0;
while(i < len)
{
if(str[i] == substr[j])
{
j++;
i++;
}
else
{
j++;
if(j > sublen)
return i - j + 1;
j = next[j] - 1;
if(j == -1)
{
i++;
j++;
}
}//else
}//for
if(j == sublen)
return i - j;
destroyNext();
return -1;
}
int main(int argc,char* argv[])
{
const char *substr = "abac";
const char *str = "absabdacabc";
int d = kmp(str,substr);
cout<<d;
}
#include <string.h>
using namespace std;
int* next = NULL;
void initNext(const char* substr)
{//得到next数组
int len = strlen(substr);
next = new int[len+1];
next[0] = len;
if(len < 1)
return;
next[1] = 0;
if(len < 2)
return;
next[2] = 1;
int k,j ;
for(j = 3; j <= len;j++)
{
k = next[j - 1];
if(substr[k - 1] == substr[j-1-1])
next[j] = k+1;
else
next[j] = 1;
}
}
void destroyNext()
{
delete []next;
}
void printNext(int *next)
{
for(int i = 1;i<=next[0];i++)
{
cout<<next[i]<<' ';
}
cout<<endl;
}
int kmp(const char* str,const char* substr)
{
initNext(substr);
int len = strlen(str);
int sublen = strlen(substr);
if(sublen > len)
return -1;
int i,j;
i = j = 0;
while(i < len)
{
if(str[i] == substr[j])
{
j++;
i++;
}
else
{
j++;
if(j > sublen)
return i - j + 1;
j = next[j] - 1;
if(j == -1)
{
i++;
j++;
}
}//else
}//for
if(j == sublen)
return i - j;
destroyNext();
return -1;
}
int main(int argc,char* argv[])
{
const char *substr = "abac";
const char *str = "absabdacabc";
int d = kmp(str,substr);
cout<<d;
}