Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1846994
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2020-12-15 10:11:23

之前写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数组了~~~



阅读(2768) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~