给出字符串在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数组的主要内容,如果未能解决你的问题,请参考以下文章