非优化版的KMP算法实现示例。
源码
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
int* findNext(string P) {
int j, k;
int m=P.length();
assert(m>0); //若m=0,退出
int* next=new int[m];
assert(next != 0); //若开辟存储区失败,退出
next[0]=-1;
j=0; k=-1;
while(j<m-1) {
while(k>=0 && P[k]!=P[j]) //不等则采用KMP自找首尾子串
k=next[k]; //k递归地向前找
j++; k++; next[j]=k;
}
return next;
}
int KMPStrMatching(string T, string P, int* N, int start) {
int j=0; //模式的下标变量
int i=start; //目标的下标变量
int pLen = P.length(); //模式的长度
int tLen = T.length(); //目标的长度
if (tLen-start < pLen) //目标比模式短,匹配无法成功
{
return -1;
}
while(j<pLen && i<tLen) { //反复比较,进行匹配
if (j==-1 || T[i]==P[j])
i++, j++;
else
j=N[j];
}
if (j>=pLen){ //实际应该是等于吧
return (i-pLen);
}
else
return -1;
}
int main() {
string t="ababababababb";
string p="abababb";
int* next;
next = findNext(p);
cout << KMPStrMatching(t, p, next, 0) << endl;
return 0;
}