在看string的find函数时,本来想看看find的效率如何,突然发现kmp算法有点忘了,做个笔记。
看了几个blog感觉不是很有感觉(主要是标号和我学的不一样,不习惯),看了严蔚敏的视频,把感觉找回来了。
next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度+1。
找了严蔚敏的几个测试实例测了一下,发现全对,说明我对next函数了解了。
随便贴个代码:
//next[0] 初始化为-1 next[1]初始化为0
//next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度。
//也就是说比严蔚敏示例的next值都小1,比较符合字符串从0开始的习惯。
#include<iostream>
using namespace std;
void getnext(char s2[],int next[])
{
memset(next,0,sizeof(next));
int i=-1,j=0;
next[0]=-1;
while(j<strlen(s2))
{
if(i==-1||s2[i]==s2[j])
{
i++;
j++;
next[j]=i;
}
else
i=next[i];
}
}
int KMP(char s1[],char s2[],int next[])
{
int i=0,j=0,len1=strlen(s1),len2=strlen(s2);
while((i<len1)&&(j<len2))
{
if(j==-1||s1[i]==s2[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==len2)
return i-len2;
else
return -1;
}
void main()
{
char s1[200] = "aaaabbbbaabaaabaaaabbbbb",s2[200] = "aabaaabaaaab"; //-1 0 1 0 1 2 2 3 4 5 6 2
int next[200];
getnext(s2,next);
for (int i = 0; i<12; i++)
{
cout<<next[i]<<" ";
}
cout<<endl;
cout<<KMP(s1,s2,next)<<endl;
system("pause");
}