一种KMP算法的C++实现
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
class KMP //定义KMP方法类
{
private:
vector<int> next_vec;
string pat;
public:
KMP(string pat):pat(pat)
{
next_vec=vector<int>(pat.size());
next_vec[0]=0;
for(int i=1,j=0;i<pat.size();i++)
{
while(j>0 && pat[i]!=pat[j]) j=next_vec[j-1];
if(pat[i]==pat[j]) j++;
next_vec[i]=j;
}
}
int search_in(string txt)
{
for(int i=0,j=0;i<txt.size();i++)
{
while(j>0 && txt[i]!=pat[j]) j=next_vec[j-1];
if(txt[i]==pat[j]) j++;
if(j==pat.size()) return i-j+1;
}
return -1;
}
};
int main()
{
string txt("yuikfghkyabcdabcdabcdeffeuigrks");
string pat("abcdabcdabcdeff");
KMP k(pat); //先用模式串初始化一个KMP对象
cout<<k.search_in(txt); //再用这个KMP对象在主串中搜索
return 0;
}
依赖的头文件 <string> <vector> 使用的命名空间std
在这种KMP算法的实现中,以vector<int> next_vec作为next函数(数组),
next_vec[i]的意义是模式串下标i匹配成功但是下一个(i+1)失败时,下一次匹配的位置
这里说的下标从0开始,即字符串第一个字符是0

浙公网安备 33010602011771号