- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
KMP算法解读
扩展KMP //求模板串中的a数组j = 0;while(T[0+j]==T[1+j])??? j = j + 1;int A[1] = j,k = 1;for(int i=2;im;i++){??? int Len = k + A[k] – 1,L = A[i-k];??? if( L Len - i + 1 )??? A[i] = L;??? else??? {??????? j = max(0,Len -i +1);??????? while(T[i+j] == T[0+j])??????????? j = j + 1;??????? A[i] = j,k = i;??? }} 扩展KMP //求主串中的b数组j = 0;while(T[0+j]==S[0+j])??? j = j + 1;int B[0] = j,k = 0;for(int i=1;im;i++){??? int Len = k + B[k] - 1,L = A[i-k];??? if( L Len - i + 1 )???? B[i] = L;??? else??? {??????? j = max(0,Len -i +1);??????? while(S[i+j] == T[0+j])??????????? j = j + 1;??????? B[i] = j,k = i;??? }} Hdu 3336 字符串问题 Trie树 AC自动机 后缀树组 hash 作业 Poj 2752 Poj 2406 Hdu 1711 Poj 1961 Poj 3461 Fzu 1901 Poj 2185 Hdu 1867 Hdu 3336 较难:poj 3167 KMP算法 t是:在一个长字符串中匹配一个短子串的无回溯算法。 定义 s: 模式串 , m: 模式串的长度 text: 要匹配的字符串, n:text的长度 设text: x1,x2,…xn , s: a1,a2,…am, 则当存在i使 xi+k=ak(k=1,2,…m)时,认为text与模式串匹配,当然text也可能与模式串有多处匹配 例如:text: abcabca, s:abc 则text与s匹配的位置有3和6 朴素算法 枚举text中的每一个位置,判断以该位置为起始位置的长度为m的子串是否与s匹配. 显然时间复杂度为O(m*n) 伪代码如下 void fun(char *text,char *s) { for(i=0;text[i];i++) { for(j=0;jm;j++) if(text[i + j]!=s[j]) break; if(j==m) { printf(“匹配成功\n”); return ; } } printf(“无法匹配\n”); } KMP算法 作为一种无回溯的算法,它是高效的,待会儿你将看到它的时间复杂度为O(m+n),空间复杂度也为O(m+n) 而且,它很容易理解,代码也很短 定义 next: 为对应模式串的数组 设字符串为 s1s2s3...sm ,其中s1,s2,s3,... si,... sm均是字符,则next[i]=m,当且仅当满足如下条件:字符串s1s2...sm equals 字符串s(i-m+1)...si-1 si 并且s1s2...sm s(m+1) unequals s(i-m) s(i-m+1)...si-1 si。 通俗地讲,next[i]保存了以s[i]为结尾的后缀与模式串前缀的最长匹配数。 定义 例如: s:a b c a b c d d e a next:0 0 0 1 2 3 0 0 0 1 i=5时,后缀有c,bc,abc,cabc,bcabc,abcabc; 相应的前缀为:a,ab,abc,abca,abcab,abcabc s: a b a b a c b next: 0 0 1 2 3 0 0 KMP算法的运行过程 我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。 如果a[i+1]==b[j+1],i和j各加1,什么时候j==m,就说B是A的子串(B串已经整完了) KMP算法的运行过程 如果a[i+1]!=b[j+1],这时候怎么办? i = 1
文档评论(0)