//KMP算法的C++实现
#include <iostream>
#include <string>
using namespace std;
/******************求子串的匹配数组**********************/
int *pre(string &sub)
{
int m = sub.length();
int *k = new int[m];
k[0] = -1;
int q = -1;
for(int i=1; i<m; i++)
{
while( q>-1 && sub.at(i)!=sub.at(q+1) )
q = k[q];
if(sub.at(i)==sub.at(q+1))
q++;
k[i] = q;
}
return k;
}
/************************求匹配串***********************/
int kmp(string &s, string &sub)
{
int m = s.length();
int n = sub.length();
int *k = pre(sub);
int q = -1;
for(int i = 0 ; i<m ; i++)
{
while(q > -1 && s.at(i) != sub.at(q+1))
{
q = k[q];
}
if(sub.at(q+1) == s.at(i))
q++;
if(q == n-1)
{
cout << "Pattern occurs with shift " << i-n+1 << endl;
q = k[q];
}
}
return 0;
}
int main()
{
string s = "dfdfdferdfdfdferdfdfdfdfgfgdfdfdfdfdfdfdfdfdferdfdfddfdffffdfdfdfdfdfdfdfdferewrdewreddfdfdf";//需要比较的串
string sub = "dfdfdfer";//有待比较的串
kmp(s,sub);
return 0;
}
KMP算法
最新推荐文章于 2024-11-16 09:45:51 发布