首先来理解一下前缀和后缀的定义,空口无凭,我先举个栗子:
src:abcdefg
prefix:a ab abc abcd abcde abcdef
suffix:g fg efg defg cdefg bcdefg
有了这个定义,接下来说一个字符串的最大前缀后缀就好说了,一个字符串的最大前缀和最小后缀就是指其完全相同的前缀和后缀里面,最长的那个,比如:abcdab的最大前缀后缀就是ab
kmp算法可以通过先求解一个lps数组来求解next数组,其中lps数组中的每一项lps[i]表示的是pattern串的子串[0,i]的最大前缀后缀,其求解代码如下:
点击(此处)折叠或打开
- void get_lps(string &pattern, int len, vector<int> &lps){
- for(int i=0;i<len;i++)lps[i]=0;
- int suffix=1;
- int prefix=0;
- while(suffix < len){
- if(pattern[prefix]==pattern[suffix]){
- lps[suffix]=++prefix;
- suffix++;
- }else if(prefix){
- prefix = lps[prefix-1];
- }else
- suffix++;
- }
- }