功能:
返回一个指向str1中第一次出现的str2的指针,如果str2不是str1的一部分,则返回一个空指针。
不匹配空字符'\0',遇到空字符即停止。
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
//p:子串
int* make_ptm(const char* p)
{
int len = strlen(p);
int* ret = static_cast<int*>(malloc(sizeof(int) * len));
if(ret != NULL)
{
int length = 0;
ret[0] = 0;
for(int i=1; i<len; i++)
{
while((length>0) && (p[length] != p[i]))
{
length = ret[length-1];
}
if(p[length] == p[i])
{
length++;
}
ret[i] = length;
}
}
return ret;
}
//s:目标字符串,p:子串
int kmp(const char* s, const char* p)
{
int ret = -1;
int sl = strlen(s);
int pl = strlen(p);
int* pmt = make_ptm(p);
if((pmt != NULL) && (0 < pl) && (pl <= sl))
{
for(int i=0, j=0; i<sl; i++)
{
while((j>0) && (s[i] != p[j]))
{
j = pmt[j-1];
}
if(s[i] == p[j])
{
j++;
}
if(j == pl)
{
ret = i + 1 - pl;
break;
}
}
}
free(pmt);
return ret;
}
int main()
{
cout << kmp("ababax", "ax") << endl;
return 0;
}