KMP算法
KMP算法,以三个人名命名的一种算法。在字符串的模式匹配算法中,相比较暴力破解(Brute-Force)有较大改进,消除了主串指针的回溯,使算法效率有了一定程度的提高。
KMP是一种很经典的算法,这里不再赘述。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class KMP {
public:
KMP();
~KMP();
int getNext(string subStr);
int getIndex(string mainStr,string subStr);
private:
vector<int> next;
};
int main(){
string mainStr;
string subStr;
cout << "KMP algorithm test:" << endl;
cout << "please input main string:" << endl;
getline(cin,mainStr);
cout << "please input substring:" << endl;
cin >> subStr;
KMP kmpIndex;
cout << "result is : " << kmpIndex.getIndex(mainStr, subStr) << endl;
return 0;
}
KMP::KMP(){
}
KMP::~KMP(){
}
int KMP::getNext(string subStr){
int k = -1;
next.push_back(-1);
for (int j = 0; j < subStr.length() - 1;) {
if (k == -1 || subStr[j] == subStr[k]) {
j++;
k++;
next.push_back(k);
}
else {
k = next[k];
}
}
return 0;
}
int KMP::getIndex(string mainStr,string subStr){
int i = 0;
int j = 0;
int mainStrLength = mainStr.length();//注1
int subStrLength = subStr.length();
getNext(subStr);
while(i < mainStrLength&&j < subStrLength){
if (j == -1 || mainStr[i] == subStr[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j >= subStr.length()) {
return (i - subStr.length());
}
else {
return -1;
}
}
注:1.在C++中string
的length()
返回的字符串长度的类型是unsigned int
,在int KMP::getIndex(string mainStr,string subStr)
函数里,会有j=-1
的情况发生,这时就会出现错误,因此需要对数据类型进行处理。