KMP模式匹配算法的实现:
利用KMP模式匹配算法在主串中查找指定模式串。如果主串包含该模式串,则返回该模式串在主串中的序号;否则返回-1。
输入样例:
abcddabcababcdaabcababcdaabcabaa(主串)
abcdaabcab(模式串)
输出样例:
-1 0 0 0 -1 1 0 0 3 0(模式串的优化版的next向量)
10(模式串在主串中的序号,主串中元素从0开始编号)
//KMP算法实现
//author:Mitchell_Donovan
//date:3.30
#include<iostream>
#include<cstring>
#include<cassert>
using namespace std;
int* findNext(string stringValue) {
int i = 0;
int j = -1;
int size = stringValue.length();
assert(size > 0);
int* next = new int[size];
assert(next != 0);//若开辟存储区域失败,退出
next[0] = -1;
while (i < size) {
while (j >= 0 && stringValue[i] != stringValue[j]) {
j = next[j];
}
i++;
j++;
if (i == size) {
break;
}
if (stringValue[i] == stringValue[j]) {
next[i] = next[j];
}
else {
next[i] = j;
}
}
return next;
}
int KMPStingMatching(const string T, const string P, int* next) {
int i = 0;
int j = 0;
int pLen = P.length();
int tLen = T.length();
if (tLen < pLen) {
return -1;
}
while (i < pLen && j < tLen) {
if (i == -1 || T[j] == P[i]) {
i++;
j++;
}
else {
i = next[i];
}
}
if (i >= pLen) {
return j - pLen + 1;
}
else {
return -1;
}
}
int main() {
string P = "abcdaabcab";
string T = "abcddabcababcdaabcababcdaabcaba";
for (int i = 0; i < P.length(); i++) {
cout << findNext(P)[i] << " ";
}
cout << endl;
cout << KMPStingMatching(T, P, findNext(P));
}