KMP算法是由Knuth,Morris,Pratt共同提出的模式匹配算法,对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。KMP算法对于朴素匹配算法的改进是引入了一个跳转表next[]。
next的求解:第一位的next值为0,第二位的next值为1。模式中第j个字符之前前后相等的最大真子串长度加1。
函数实现:
void get_next(SString T,int next[])
{//求模式串T的next函数值并存入数组next
i=1;next[1]=0;j=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;++j;next[i]=j;
}
else j=next[j];
}
}
nextval的求解:第一位的nextval值为0,第二位如果与第一位相同则为0,不同则为1。
第j位与next[j]位进行比较,不同则为next[j];相同则与第next[j]位next值相同。
函数实现:
void get_nextval(SString T,int nextval[])
{//求模式串T的next修正函数值并存入数组nextval
i=1;nextval[1]=0;j=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;++j;
if(T.ch[i]!=T.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
样例:
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
模式串 | a | b | a | a | b | c | a | c |
next | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
nextval
| 0 | 1 | 0 | 2 | 1 | 3 | 0 |
2
|