KMP算法
主要说明两个思路点
1.next数组的引入
"字符串匹配的时候,不想一直从头开始"
比如对于字符串:
a
b
a
b
a
c
d
e
f
ababacdef
ababacdef
下标:
0123456789
0123456789
0123456789
a
b
a
b
c
ababc
ababc
下标:
012345
012345
012345
按照思路,从上面0开始,判断以0开头能不能完全匹配下面字符串,不行则移动至下一位再次判断
其实,第一次匹配的时候是
a
a
a和
c
c
c不匹配,可以直接移动上面指针不动指向
a
a
a,下面移动到位置2,进行判断。
因为abab此时前缀和后缀公共部分为ab,所以移动到
a
a
a。
所以可以引next[i]数组表示"如果当前位置i没有匹配,可返回到位置next[i]"——数组的前缀和后缀相等的最大长度
2.next数组的求法
求法其实是,用该字符串作为主字符串,再用该字符串去匹配,得到的长度即为next数组。
void getNext(char *s, int *next)
{
next[0] = -1;
int i = 0, j = -1;
while(i < strlen(s))
{
if(j == -1 || s[i] == s[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}