1、自己应该要造的测试用例
(1)
AAAAAAAAAA
A
(2)
A
B
2、注意事项
求next数组时i=1,j=0
next【1】要初始化为0
3、注意字符串的下标应该从1开始
4、注意调用index_kmp函数时pos的位置是i-length2+1(即输出的那个数+1,如果下标从0开始就是输出的那个数)
#include <stdio.h>
#include <string.h>
#define N 1000006
char s1[N],s2[N];
int next[N];
void get_next(int length)
{
int i=1;
int j=0;
next[1]=0;
while(i<=length)
{
// printf("next[%d]=%c next[%d]=%c\n",i,s2[i],j,s2[j]);
if(j==0||s2[i]==s2[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
void print(int length)
{
for(int i=2;i<=length+1;i++)
{
printf("%d ",next[i]-1);
}
}
void index(int l1,int l2,int pos)
{
int i=pos;
int j=1;
while(i<=l1&&j<=l2)
{
if(j==0||s1[i]==s2[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>l2)
{
printf("%d\n",i-l2);
index(l1,l2,i-l2+1);
}
else
{
return;
}
}
int main()
{
scanf("%s %s",s1+1,s2+1);
//printf("%s %s\n",s1+1,s2+1);
int l1=strlen(s1+1);
int l2=strlen(s2+1);
// printf("%d %d\n",l1,l2);
get_next(l2);index(l1,l2,1);
print(l2);
return 0;
}