现在KMP算法我们基本完成了,对于next[i]函数还有提升的空间,比如字符串"abababaac"中
next[2]=0,字符s[2]="a"失配后应该和s[0]比较,但是s[0]也是"a",所以必定失配,那么这种
情况可以直接跳过进行下一次匹配,比较极端的情况,字符串"aaaaaab",当字符s[5]="a"失配
的时候,按next[i]算法,s[5]还要和s[4],s[3],s[2],s[1],s[0]进行比较,但是这些字符全是a,
因此肯定都失配,可以直接进行next[0]的匹配,减少不必要的比较次数,因此当s[i]==s[next[i]]时,
可以更新next[i]=next[next[i]],我们只需稍微更改下(2)中计算next[i]的代码:
nnext[0] = -1;
nnext[1] = 0;
if (t[0] == t[1])
nnext[1] = -1;
i=1, j=0;
while (i<tlen){
if (j == -1 || t[i] == t[j]){
++i;
++j;
if (t[i] != t[j] )
nnext[i] = j;
else
nnext[i] =nnext[j];
}
else
j = nnext[j];
}
改进的字符串t="aaaaaab"的nnext值如下表:
| a | a | a | a | a | a | b |
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
next[i] | -1 | 0 | 1 | 2 | 3 | 4 | 5 |
nnext[i] | -1 | -1 | -1 | -1 | -1 | -1 | 5 |
改进的字符串t="abababaac"的nnext值如下表:
| a | b | a | b | a | b | a | a | c |
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
next[i] | -1 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 1 |
nnext[i] | -1 | 0 | -1 | 0 | -1 | 0 | -1 | 5 | 1 |