字符串匹配算法,返回模式串第一次匹配目标串成功时的索引值。
#include <iostream>
#include <string>
using namespace std;
//KMP
int *pnext(string s){
int n=s.size();
int k=-1,i=0;
int *next = new int[n];
for (int i=0;i<n;++i) next[i]=-1;
while( i < n ){
if ( (k==-1) || (s[i]==s[k]) )
{
++k,++i;
next[i]=k;
}
else{
k=next[k];
}
}
return next;
}
int KMP(string target, string mode){
int n=target.size(),m=mode.size();
int i=0,j=0;
int *next=pnext(mode);
while (i<n)
{
if (target[i]==mode[j]) ++i,++j;
else j=next[j];
}
delete []next;
if (j==m){
return (i-j);
}
else{
return -1;
}
}
int main(){
//测试
string a="ababc",b="abc";
cout << KMP(a,b);
return 0;
}