今天看数据结KMP算法有点懵,特此记录一下
1.kmp算法相对于暴力字符串匹配的优点?===时间复杂度O(m+n)
如上图所示,当C和D不匹配时,KMP算法不会像暴力破解(移动下边的A和上边的B匹配),而是保持上边个字符串不动,仅仅移动下边个字符串(称为模式串)如下图:
这种方法大大节省了匹配次数,提高了效率,但是kmp怎么知道怎么移动呢?这就是next数组的功劳
2.求next数组
我们默认next[0] = -1.我们以求next[6]为例,6位置前边的子串为abcaab,最大的重复字符串为ab,所以next[6]=2
3.代码实现
#include<iostream>
#include<cstring>
#include<cstdlib>>
using namespace std;
int* getnext( char a[])
{
int *nt;
nt = (int*)malloc(sizeof(int)*10);
int len = strlen(a);
nt[0] = -1;
int j = 0,k = -1;
while(j<len)
{
if(k==-1||a[j]==a[k])
nt[++j] = ++k;
else
k = nt[k];
}
return nt;
}
int main()
{
char a[]="abcfadfcdk";
char b[]="adf";
int len1 =strlen(a);
int len2 =strlen(b);
int i = 0,j = 0;
int *nt;
nt = getnext(b);
//cout<<nt[0]<<" "<<nt[1]<<" "<<nt[2]<<endl;
while(i<len1&&j<len2)
{
if(j==0||a[i]==b[j])
{
i++;
j++;
}
else
j = nt[j];
}
if(j==len2)
printf("find the substring!");
else
printf("can not find!~");
return 0;
}