刚刚笔试完创新工厂,里面考到了KMP,算我幸运,笔试之前才看过了KMP,大体上有一点了解。但是做题的时候还是出了一些问题。
书上和网上的代码下标都是从1开始的,可是在编程序的时候,大家都习惯从0开始。
接着,我就自己写了这个下标从0开始的KMP代码
如果有问题,欢迎大家拍砖。
#include <iostream>
#include <string>
using namespace std;
void get_nextval(const char* T,int nextval[])
{
int i = 0;
nextval[0] = -1;
int j = -1;
while(i < strlen(T) -1 )
{
if (j == -1 || T[i] == T[j])
{
i++;
j++;
if (T[i] != T[j])
{
nextval[i] = j;
}
else
{
nextval[i] = nextval[j];
}
}
else
{
j = nextval[j];
}
}
}
int KMP(const char* S, const char *T,int next[])
{
int i = 0;
int j = 0;
int slen = strlen(S); //如果下面写成i<strlen(T),如果i是负数,那么i会比stelen的结果大得
int tlen = strlen(T); //这样写是有原因的,大家可以查一查负数和无符号数的比较结果
while (i < slen && j < tlen)
{
if (j == -1 || S[i] == T[j])
{
i++;
j++;
if (T[j] == '\0')
{
return i-j;
}
}
else j = next[j];
}
return -1;
}
int next[10];
int main()
{
string a = "aa";
string b = "aa9";
get_nextval(b.c_str(),next);
cout<<KMP(a.c_str(),b.c_str(),next);
}