首先要对模式串进行预处理。
预处理过程就是计算出指定位置的前缀和后缀的最大相同的长度(啊啊啊啊。。估计只有我一个人能看懂)
http://www.acmerblog.com/kmp-algorithm-4407.html
这个文章说得很清楚
比如说 :
A A A C B C A A A
0 1 2 0 0 0 1 2 3
代码:
void getnext(int next[], char par[20],int n)//翻译自算法导论
{
//pat从1开始,next 也 从1开始
int k = 0;
int i = 2;
next[1] = 0;
for (i = 2; i <= n; i++)
{
while (k > 0 && par[k + 1] != par[i])
k = next[k];
if (par[k + 1] == par[i])
k++;
next[i] = k;
}
}
主函数:
void kmp(char next[], char text[],char pat[], int len,int m)
{
int k = 0;
for (int i = 1; i <= len; i++)
{
while (k > 0 && text[i] != pat[k + 1])
{
k = next[k];
}
if (text[i] == pat[k + 1])
{
k++;
}
if (k == m)
{
cout << "position " << i - m << endl;
k = next[k];
}
}
}