kmp算法本人很少用到,猛地一写还差点出错。
在c语言的 < string.h>中就有字符串匹配函数的实现,在我目前所使用的范围内strstr()远远足够,对于两者之间的速度,我更倾向于strstr()(对标准库函数的盲目崇拜)。http://bbs.csdn.net/topics/330170343
本来写的全局变量,然后想想并无价值,没办法直接套用,就给改成内部函数了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=105;
void getnext(const char *s,int* &next)
{
int i=-1,j=0;
int n=strlen(s);
next[0]=-1;
while(j<n&&i<j)
{
if(i==-1||s[i]==s[j])
{
i++,j++;
if(s[i]==s[j])
next[j]=next[i];
else
next[j]=i;
}
else
i=next[i];
}
}
int KMPfind(const char *s1,const char *s,int pos)
{
int n=strlen(s);
int l=strlen(s1);
if(pos>=l||pos<0)
return 1;
int *next=new int[n];
getnext(s,next);
int i=pos,j=-1;
while(i<l&&j<n)
{
if(j==-1||s1[i]==s[j])
i++,j++;
else
j=next[j];
}
delete []next;
if(j==n)
return i-n;
return -1;
}
int main()
{
char s[maxn];
char s2[maxn];
cin>>s>>s2;
cout<<KMPfind(s2,s)<<endl;
char *p=strstr(s2,s);//附上strstr的用法,找到返回匹配到的第一个子字符串的头指针,否则返回NULL
if(p!=NULL)
cout<<(p-s2)<<endl;
return 0;
}