kmp算法总结

转载请输入转载地址:http://www.cnblogs.com/handsomecui/

  kmp算法一般分两部getp和kmp;getp是为了得到p数组,这个数组很神奇,p[i]=j;代表第i-1位最近一次失配的位置;

i         1  2  3  4  5  6  7  8

s[i]     a  b  a  b  a  b  a  b 

p[i]    0  0 1  2  3  4  5  6

p[i]均代表的是最近一次失配的位置;

有了失配位置,那么我们很容易得到循环节;当前循环节长度就是i-p[i];很容易求得当i%(i-p[i])==0(当然p[i]!=-1)的时候代表字符串开始循环,循环到i-1;

当循环,我们可以求出循环次数i/(i-p[i]);

重刷了kmp的题;

总结下:

http://www.cnblogs.com/handsomecui/p/4710836.html

找串的重复度,相当于求循环次数;

http://www.cnblogs.com/handsomecui/p/4711822.html

相对于上题,这题不是从自身找,而是串2在串1中出现的次数;(完全出现)

当找到串2结束时,我们只需要回到串2 起点重新匹配就好了;

http://www.cnblogs.com/handsomecui/p/4710935.html

http://www.cnblogs.com/handsomecui/p/5233496.html

相对于上题,这两个题也是串2在串1中出现的次数;但是这个相当于看小说找文字一样,假设abab abababab 这个题答案是3,上个题就是2,上个是剪布条,只有是abab  abab 这个是匹配文字,所以是三个,位置:1 4,2 6,4 8;

http://www.cnblogs.com/handsomecui/p/4711034.html

让在一个串中找字串,使这个字串即是串s的前缀又是后缀;我们需要知道

next[i]的意义:前面长度为i的字串的【前缀和后缀的最大匹配长度】 ;

我们从len开始往前找就好了;这个题非常考验对p数组的理解;

http://www.cnblogs.com/handsomecui/p/4711437.html

让求串2在串1中首次出现的位置;这里既可以用kmp,也可以用函数strstr,非常实用;

http://www.cnblogs.com/handsomecui/p/4711719.html

给定一个字符串,问这个字符串的所有前缀中,有哪些前缀可以由某个串重复k次组成;

用到了我们前面总结的结论:

当i%(i-p[i])==0(当然p[i]!=-1)的时候代表字符串开始循环,循环到i-1;可以求出循环次数i/(i-p[i]);

http://www.cnblogs.com/handsomecui/p/4711962.html

第二个串能否在第一个串循环位移后的串中找到;我们只需要把串翻转下就好了;

http://www.cnblogs.com/handsomecui/p/4764736.html

s的子串中不包含s1,s2...sn的最长串;

这个题就比较综合了,用到贪心的策略,用kmp找位置,贪心求长度就好了;

 http://www.cnblogs.com/handsomecui/p/4907830.html

添加串使其回文;反转串进行kmp匹配即可;

原文地址:https://www.cnblogs.com/handsomecui/p/5304020.html