- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.3.2 KMP算法 假设已有next函数,则KMP算法如下: int StrIndex_KMP(char *s,char *t,int pos) /*从串s的第pos个字符开始找首次与串t相等的子串*/ { int i=pos,j=1,slen,tlen; while (i=s[0] j=t[0] ) /*都没遇到结束符*/ { if (j==0||s[i]==t[j]) { i++; j++; } else { j=next[j]; /*回溯*/ } } if (jt[0]) { return i-t[0]; /*匹配成功,返回存储位置*/ } else { return –1; } } O(m*n) OR O(m+n) 3.3.2 KMP算法 next函数值仅取决于模式本身而和主串无关。 从分析next函数的定义出发用递推的方法求next函数值。 该如何求next函数呢? 由定义可知: next[1]=0 设 next[j]=k,则有: "t1 t2 … tk-1" ="tj-k+1 tj-k+2 … tj-1 " next[j+1]=? 可能有两种情况: 第一种情况:若 tk=tj 则表明在模式串中 "t1 t2 … tk-1 tk " ="tj-k+1 tj-k+2 … tj-1 tj " next[j+1]=next[j]+1 3.3.2 KMP算法 第二种情况:若tk ≠tj 则: 把求next函数值的问题看成是一个模式匹配问题,整个模式串既是主串又是模式。 当tk ≠tj 时应将模式向右滑动,使得第next[k]个字符和“主串”中的第j个字符相比较。 若next[k]=k′,且t k′=tj,则说明在主串中第j+1个字符之前存在一个最大长度为k′的子串,使得 "t1 t2 … t k′ "="tj-k′+1 tj- k′+2 … tj " 因此: next[j+1]=next[k]+1 同理若t k′≠tj,则将模式继续向右滑动至使第next[k′]个字符和tj 对齐,依此类推,直至tj 和模式中的某个字符匹配成功或者不存在任何 k′能匹配成功。 若t1≠tj+1 , 则有:next[j+1]=1 否则若t1=tj+1 ,则有:next[j+1]=0 3.3.2 KMP算法 求next函数值过程的算法如下: void GetNext(char *t,int next[ ]) /*求模式t的next值并寸入next数组中*/ { int i=1,j=0; next[1]=0; while (it[0]) { while (j0t[i]!=t[j]) { j=next[j]; } i++; j++; if (t[i]==t[j]) { next[i]=next[j]; } else { next[i]=j; } } } O(m) 3.3.3 基于KMP算法的应用 ACM/ICPC的实战练习题Oulipo ,[POJ 3461] 题目要求:给出两个字符串,求出模式串T在主串S中出现了多少次。其中T长1万,S长1百万。 解题思路: (1) 因为问题规模较大,所以本题用BF算法肯定超时; (2) 那就用KMP算法,关键还是在于next
文档评论(0)