#include <stdio.h>
#include <string.h>
void Next(char *str,int *next);
int FindStr(char *bigStr,char *smallStr, int *next);
void main()
{
char bigStr[30],smallStr[8];
int next[4]; //next的长度应该为smallStr的一半
int n;
gets(bigStr);
gets(smallStr);
Next(smallStr, next);
n = FindStr(bigStr,smallStr,next);
printf("%d\n",n);
}
void Next(char *str,int *next)
{
int i=0,j=0;
int len;
len = strlen(str);
next[0] = 0;
for ( ; i < len; )
{
if( j==0 || *(str+i)==*(str+j) )
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int FindStr( char *bigStr, char *smallStr, int *next)
{
int i,j;
int lenBig,lenSmall;
lenBig = strlen(bigStr);
lenSmall = strlen(smallStr);
for ( i=0,j=0; i<lenBig&&j<lenSmall; )
{
if (j==-1 || *(bigStr+i)==*(smallStr+j))//j-1写在前面,如果写在后面,*(smallStr+j)就越界了
{
i++;
j++;
}
else
{
j = next[j]-1;//Next所求的是每个数的位置,而不是下标
}
}
if( j == lenSmall )
{
return i-j+1;
}
else
return 0;
}
KMP算法
最新推荐文章于 2024-10-02 23:40:03 发布