本人比较懒,用文字描述比较复杂,而且不易弄懂,所以给大家来个视频,我是按照视频的讲解,敲出下面的代码,求轻喷
视频链接: http://www.bilibili.com/video/av3246487/
阿三讲的kmp,挺不错的,推荐下,代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#define N 1009
using namespace std;
const int inf = 0x3f3f3f3f;
void cal_next(char p[], int len, int next[]);
int KMP(char s[], int len1, char p[], int len2, int next[]);
int main()
{
int next[N], len1, len2;
char s[N], p[N];
scanf(" %s %s", s, p);
len1 = strlen(s); len2 = strlen(p);
cal_next(p, len2, next);//建立next[N]数组
int k = KMP(s, len1, p, len2, next);
cout << k << endl; //输出在母串中的位置
return 0;
}
void cal_next(char p[], int len, int next[])
{
int i, j;
next[0] = 0;
for(i = 1; i < len; i++)
{
j = next[i - 1];
while(j > 0 && p[i] != p[j])
j = next[j - 1];
if(p[j] == p[i])
next[i] = j + 1;
else
next[i] = 0;
}
}
int KMP(char s[], int len1, char p[], int len2, int next[])
{
int i, j;
i = j = 0;
while(i < len1 && j < len2)
{
if(s[i] == p[j])
{
i++; j++;
}
else
{
if(j == 0) i++;
else
j = next[j - 1];
}
}
return j == len2 ? i - j : -1;
}