字符串匹配之最大前缀后缀

2780阅读 0评论2020-12-15 stolennnxb
分类:C/C++

之前写kmp的时候只是硬记了next数组的求法,今天重温了一下,发现最大前缀后缀这么理解也是可以的,就来写它一波~~~
首先来理解一下前缀和后缀的定义,空口无凭,我先举个栗子:
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]的最大前缀后缀,其求解代码如下:

点击(此处)折叠或打开

  1. void get_lps(string &pattern, int len, vector<int> &lps){
  2.     for(int i=0;i<len;i++)lps[i]=0;
  3.     int suffix=1;
  4.     int prefix=0;
  5.     while(suffix < len){
  6.         if(pattern[prefix]==pattern[suffix]){
  7.             lps[suffix]=++prefix;
  8.             suffix++;
  9.         }else if(prefix){
  10.             prefix = lps[prefix-1];
  11.         }else
  12.             suffix++;
  13.     }
  14. }
这样求解出来的lps向右移动一个位置,并用-1补充首位置,求得的即是kmp算法中的next数组了~~~



上一篇:leetcode32题解之最长有效括号
下一篇:荷兰国旗问题