转载请输入转载地址: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匹配即可;