//字符串查找(i回退)
int BF(const char *str,const char *sub,int pos)//O(n*m),O(1)
{
int i = pos;
int j = 0;
int lenstr = strlen(str);
int lensub = strlen(sub);
if(i<0 || i>=lenstr)
{
return -1;
}
while(i<lenstr && j<lensub)
{
if(str[i] == sub[j])
{
i++;
j++;
}
else
{
i = i - j +1;//i回退到刚才的位置的下一个
j = 0;
}
}
if(j == lensub)//找到了
{
return i-j;
}
else //没有找到
{
return -1;
}
}
i不回退 ——KMP算法
i不回退,所以空间复杂度为O(n+m)
int KMP(const char *str,const char *sub,int pos)
{
int i = pos;
int j = 0;
int lenstr = strlen(str);
int lensub = strlen(sub);
if(i<0 || i>=lenstr)
{
return -1;
}
int *next = (int *)malloc(lensub*sizeof(int));
GetNextVal(sub,next);
while(i<lenstr && j<lensub)
{
if(j==-1 || str[i]==sub[j])
{
i++;
j++;
}
else
{
//i不回退
j = next[j];
}
}
free(next);
if(j == lensub)
{
return i-j;
}
else
{
return -1;
}
}
int main()
{
char *str = "ababcabcdabcde";
char *sub = "abcd";
printf("%d\n",KMP(str,sub,6));
return 0;
}