最长相等前后缀next[]
代码随想录
比如 “orro”
o
or
orr
orro
最长相等前后缀
next={0,0,0,2}
比如“aabaaf”
a 0
aa 1
aab 0
aaba 1
aabaa 2
aabaaf 0
next = {0,1,0,1,2,0}
力扣字符串28
刷题链接:力扣28
// KMP算法
/*获取目标字符串的最长前后缀数组*/
void getNext(int *next, const char *s)
{
int j=0;
next[0] = j;
int length = strlen(s);
for(int i=1; i<length; i++)
{
while(j>0 && s[i]!=s[j]) //j 要大于零,才能进行下一步
{
j = next[j-1]; /*当前位置的字符与遍历到的字符不相等,则一直回退*/
}
if(s[i]==s[j])
{
j++; //最长相等前后缀的字符个数,同时也是next前缀末尾位置
}
next[i] = j; //next保存每个位置的最长相等前后缀的个数
}
}
int strStr(char* haystack, char* needle) {
int lenNeed = strlen(needle);
if(lenNeed == 0)
return 0;
int next[lenNeed];
getNext(next,needle); //获取目标字符串对应位置最长相等前后缀个数的数组
int lenHay = strlen(haystack);
int j=0;
for(int i=0; i<lenHay; i++)
{
while(j>0 && haystack[i]!= needle[j])
{
j=next[j-1];
}
if(haystack[i]== needle[j])
{
j++;
}
if(j == lenNeed ) //查找到了完整的模式串
{
return (i-lenNeed +1); //返回匹配目标字符串的首字母的位置下标
}
}
return -1;
}