问题
给定两个字符串S=“s1s2s3.........”和P=“p1p2p3...........”,在主串S中寻找子串P的过程称为模式匹配。P称为模式。如果匹配成
功,返回P在S中的位置,如果匹配成功,返回0。
KMP算法
KMP算法分为两部分:
·求next数组
·求P在S中的位置
代码如下:
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
int main()
{
char S[100],P[100];
cout<<"Please input S"<<endl;
cin>>S;
cout<<"Please input P"<<endl;
cin>>P;
cout<<endl;
int slen=strlen(S);
int plen=strlen(P);
/***************************************/
int next[plen];
next[0]=-1;
int k=-1;
int j=0;
while(j < plen-1)
{
if(k == -1 || P[j] == P[k])
{
++k;
++j;
next[j] = k;
}
else
{
k=next[k];
}
}
for(j=0;j<plen;j++)
{
cout<<"next[j]的值为:"<<next[j]<<endl;
}
cout<<endl;
/*******************************************/
int i=0;
j=0;
while(i < slen && j < plen)
{
if(j == -1 || S[i] == P[j])
{
j++;
i++;
}
else
{
j=next[j];
}
}
if(j == plen)
{
cout<<"P在S中的位置是 "<<i-j;
}
else
return -1;
return 0;
}
运行截图: