Sunday
相当于strstr函数,功能强于KMP
核心思想
谁跟头比标记谁,在主串上只能出现在以一个不同的位置之后的匹配串的长度上,通过从右向左的对齐的方式 移动子串
找到等长的下一个在子串中出现的位置,使用哈希查找,使用255字符哈希 先对匹配串处理 next 数组
下一次佩的位置 k + len - next[主[k + len]]
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int * CreateNext(char * str)
{
int * next = (int *)malloc(sizeof(int) * 256);
int len = strlen(str);
int i ;
for(i = 0 ; i < 256 ; i ++)
{
next[i] = -1;
}
for( i = 0 ; i < len ; i ++ )
{
next[str[i]] = i;
}
return next;
}
int SundaySearch(char * mainstr , char * maststr)
{
int * next = CreateNext(maststr);
int i = 0;
int j = 0;
int pMask;
int mainlen = strlen(mainstr);
int mastlen = strlen(maststr);
pMask = 0;
while(i < mainlen && j < mastlen )
{
if(mainstr[i] == maststr[j])
{
i ++;
j ++;
}
else
{
if(pMask + mastlen < mainlen)
{
pMask = pMask + mastlen - next[mainstr[pMask + mastlen]];
j = 0;
i = pMask;
}
else
{
return -1;
}
}
}
if(j == mastlen)
{
return pMask;
}
else
{
return -1;
}
}