Code前端首页关于Code前端联系我们

KMP算法解决什么问题?示例

terry 2年前 (2023-09-27) 阅读数 61 #数据结构与算法

1。 KMP算法解决什么问题?

KMP 解决了使用线性复杂度来查找主字符串中模式字符串第一次出现的下标的问题。
如果使用标准方法,即找到两个循环,时间复杂度为O(M*N)。 M是主串的长度,N是模式串的长度。

【示例】
使用 KMP 算法,可以使用 O(N) 的时间复杂度在大字符串 @ abcdef@abga 中查找模式字符串“abga”。

2。您需要了解哪些部分才能获得 KMP?

  1. 后缀与后缀
  2. next[N]next[N]
  3. next[N]next[N]重复方法
  4. 移动[N]指针next next字符串指针对应主绳

3. 分离说明

1.前缀和后缀的含义,后面的[N]个数字的含义

[示例]
字符串长度 str="babdefbab" 前缀和后缀如表1所示。 abdefbab

9babdefbab00100012
babdefbabba ♸♶‶♸♶ es 和相同长度的后缀相同:b、bab 、babdefbab。
正确的后缀和相同长度的正确后缀是 b 和 bab。其中,最长的正确后缀是bab。
【概念】
根据上面的例子,我们可以得出关于后缀和后缀的结论
  • 后缀指的是字符串头。正确的前缀表示不包含字符串本身的标头。字符串的实际后缀长度小于字符串的长度。
  • 后缀表示字符串的结尾。字符串的实际后缀长度小于字符串的长度。
2。 [N] next [N] 数组的含义

【概念】
next[i]next[i] 表示 strstr 中下标从 00 到 i-1i−1 的子串 最长等效实数后缀的长度和后缀。 next[i]next[i]的编号为[-1,N-1]$。

【示例】 仍然使用字符串 str="babdefbab" 例如

i012345678
next[i]-13。 next [N]next[N] 数组 查找方式
voidnextSolution(int*next,int len,char*pattern){int index=0,k=-1;
    next[0]=k;while(index<len-1){if(k==-1||pattern[index]==pattern[k]){
            next[++index]=++k;}else{
            k=next[k];}}}
  • 看图说明
    初始值 i=0,next[i]=0,k=next[i]i=0,next[ i]=0 ,k=next[i]
  1. 当 k==-1k==−1 时,next[i+1]=k+1。
    KMP算法解决什么问题?举个例子
  2. 当str[i]=str[k]str[i]=str[k]时,下一个[i+1]=k+1。
    KMP算法解决什么问题?举个例子
  3. 当 str[i] \ne str[k]str[i]=str[k] 时,返回 k=next[k]。
    KMP算法解决什么问题?举个例子
4。按照 [N] next [N] next 的顺序移动指向模式串的指针,以匹配主串
intkmp(char* haystack,char* needle){constint len_ned=strlen(needle);if(len_ned==0)return0;constint len_hay=strlen(haystack);if(len_ned>len_hay)return-1;int next[len_ned];nextSolution(next,len_ned,needle);int index_hay=0,index_needle=0;while(index_hay<len_hay&&index_needle<len_ned){if(index_needle==-1||haystack[index_hay]==needle[index_needle]){
            index_hay++;
            index_needle++;}else{
            index_needle=next[index_needle];}if(index_needle==len_ned){return index_hay-len_ned;}return-1;}

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门