给出字符串在KMP算法中的Next数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给出字符串在KMP算法中的Next数组相关的知识,希望对你有一定的参考价值。

书上有一个例子,字符串是CGTCTCTC,它的next[i]数组=-1,0,0,-1,1,-1,1,-1,1,这是为什么啊,那么字符串agacabaaad的next[i]是多少

逐个查找对称串。

只要循环遍历这个子串,分别看前1个字符,前2个字符,3个... i个 最后到15个。

第1个a无对称,所以对称程度0

前两个ag无对称,所以也是0

依次类推前面0-4都一样是0

最后一个是0~3都一样是0

前缀next数组的求解算法:

void SetPrefix(const char *Pattern, int prefix[])


int len=CharLen(Pattern);//模式字符串长度。

prefix[0]=0;

for(int i=1; i<len; i++)


int k=prefix[i-1];

//不断递归判断是否存在子对称,k=0说明不再有子对称,Pattern[i] != Pattern[k]说明虽然对称,但是对称后面的值和当前的字符值不相等,所以继续递推

while( Pattern[i] != Pattern[k]  &&  k!=0 )               

k=prefix[k-1];     //继续递归

if( Pattern[i] == Pattern[k])//找到了这个子对称,或者是直接继承了前面的对称性,这两种都在前面的基础上++

prefix[i]=k+1;

else

prefix[i]=0;       //如果遍历了所有子对称都无效,说明这个新字符不具有对称性,清0



扩展资料:

设主串(下文中我们称作T)为:a b a c a a b a c a b a c a b a a b b

模式串(下文中我们称作W)为:a b a c a b

用暴力算法匹配字符串过程中,我们会把T[0] 跟 W[0] 匹配,如果相同则匹配下一个字符,直到出现不相同的情况,此时会丢弃前面的匹配信息,然后把T[1] 跟 W[0]匹配,循环进行,直到主串结束,或者出现匹配成功的情况。这种丢弃前面的匹配信息的方法,极大地降低了匹配效率。

而在KMP算法中,对于每一个模式串我们会事先计算出模式串的内部匹配信息,在匹配失败时最大的移动模式串,以减少匹配次数。

参考资料来源:百度百科-kmp算法

参考技术A http://www.cnblogs.com/10jschen/archive/2012/08/21/2648451.html
上面有算法说明,自己参考下吧。追问

这个上面的算法和我们有些区别,比如第一个字符,我们给的是-1,他给的是0

本回答被提问者和网友采纳

以上是关于给出字符串在KMP算法中的Next数组的主要内容,如果未能解决你的问题,请参考以下文章

KMP算法中的next数组如何计算

KMP算法的next[]数组通俗解释

关于kmp算法

KMP中next数组的应用

KMP算法——详解next数组

KMP算法——详解next数组