KMP算法

KMP算法

KMP有什么用

KMP的作用:KMP主要应用在字符串匹配上。

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

这个是我学过算法中最最最难理解的(可能是我笨)

我个人认为应该先弄清什么是前缀后缀

前缀:前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。(这里一定是包括第一个字符的,就是每一个前缀都包含第一个字符)

后缀:后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。(就是每一个后缀都要包含最后一个字符)

什么是最长公共前后缀:我理解就是最长的相等前后缀。(注意不是对称存在 比如:abba 这个不可以说成是相等前后缀,应该是abab 这样才是相等的)

我觉得想学会一定先把这俩个概念弄清楚。

学习KMP的时候大家应该都写过next数组,这是干啥的呢?(这也是我当时最困惑的点)

其实next数组就是一个前缀表,前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。

那我们在next数组储存的是什么?

实际上,这个值就是记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。

构造一个next数组:

 void getNext(int* next, const string& s){
     int j = -1;
     next[0] = j;
     for(int i = 1; i < s.size(); i++) { // 注意i从1开始
         while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了
             j = next[j]; // 向前回退
         }
         if (s[i] == s[j + 1]) { // 找到相同的前后缀
             j++;
         }
         next[i] = j; // 将j(前缀的长度)赋给next[i]
     }
 }

具体理解还会写.

你可能感兴趣的:(c++)