本题链接:点击打开链接
本题大意:
输入一个N和一个M,第二行输入N个数值,第三行输入M个数值,M < N,求N中包含M的起始位置。
解题思路:
使用KMP算法,求出next数组,然后进行比较,当首次出现子字符串时,输出主字符串的位置-子字符串的长度,因为从零开始编的号,故需加一。
参考代码:
#include<stdio.h>
#include<string.h>
int str1[1000100];
int str2[1000100];
int next[1000100];
int n,m,len1,len2;
void getnext()
{
int i=0,j=-1;
next[i]=j;
while(i<m)
{
if(j==-1||str2[i]==str2[j])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
}
int kmp()
{
int i=0,j=0;
while(i<n)
{
if(j==-1||str1[i]==str2[j])
{
i++;j++;
if(j==m)
{
return i-m+1; //输出位置编号从一开始,但从零开始编的号,故加一;
}
}
else
j=next[j];
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(next,0,sizeof(next));
for(int i=0;i<n;i++)
scanf("%d",&str1[i]);
for(int j=0;j<m;j++)
scanf("%d",&str2[j]);
getnext();
kmp();
printf("%d\n",kmp());
}
return 0;
}