首页 > 其他分享 >KMP

KMP

时间:2024-01-20 16:37:49浏览次数:27  
标签:char 匹配 int next nextt KMP

KMP

void getnext(char *p)

{

  int lenp=strlen(p);

  nextt[0]=-1;

  int k=-1;

  int j=0;

  while(j<lenp-1)

  {

    //p[k]表示前缀,p[j]表示后缀(并没有“真”!)

    if(k==-1||p[j]==p[k])//j在这

    {

      j++;//j+1在这

      k++;//k=k+1

      //---->若p[k]=p[j],则next[j+1]=next[j]+1;

      //下一个位置的next

      if(p[j]!=p[k])//当p[k]!=p[j]时,与主串不匹配时可以返回到这

      {

        nextt[j]=k;

      }

      else//当p[j]=p[k]时与主串匹配时你在j位置不匹配匹配串返回这里当前

          //还是 不能与主串匹配,然后还是要返回next[]即next[next[k]]

          nextt[j]=nextt[k];//优化了

    }

    else

    {

      k=nextt[k];

    }

  }

  return;

}

int KMP(char *s,char *p)

{

  int i=0;

  int j=0;

  int lens=strlen(s);

  int lenp=strlen(p);

  while(i<lens&&j<lenp)

  {

    //如果j=-1(表示第一次开始或者重新开始匹配),即失配于首字符

    if(j==-1||s[i]==p[j])

    {

      j++;

      i++;

    }

    else

    {

      //如果j!+-1,或者当前匹配失败 ,则

      j=nextt[j]; // i不变,j=next[j]

    }

  }

  if(j==lenp)

  return 1;//匹配成功

  else

  return 0;

}

 

标签:char,匹配,int,next,nextt,KMP
From: https://www.cnblogs.com/mingzhaomz/p/17976674

相关文章

  • kmp算法的理解与记忆
    首先有两步,1求next数组,2进行比对。我这种是数组后移的方法,即第一个数是-1。步骤就是如果前后缀不相等,j就要后撤,要后撤因此要有范围。j>=0;如果相等就j++;每一次循环求出对应的next[i]。要注意的点是因为我这是数组后移的方法,因此比较用next[j+1]比较。2比对跟求next差不多......
  • 【学习笔记】KMP 相关算法
    KMP单模式串匹配,比较平凡所以不说了,比较有借鉴意义的每次拓展一位和\(nxt\)数组能极大减少不合法的匹配,时间复杂度\(O(|s|+|t|)\)。引出一个定义,记满足\(s[1,i]=s[|s|-i+1,|s|]\)的前缀为字符串\(s\)的\(\mathrm{border}\),所有的\(\mathrm{border}\)构成\(\mathrm{Bo......
  • 【CF30E】Tricky and Clever Password 题解(manacher + exKMP)
    manacher+exKMP+二分。感觉是最粗暴的方法,想出来之后自己硬莽了4k,荣获题解区最长。Solution约定:下文所提及到的所有的回文串,均指奇长度回文串。显然把题目拆成两个部分,中间的回文串,以及两边相同的连续子串。考虑一下从哪个入手比较好。忘记是咋想的了,易得从两边相同......
  • Manacher与exKMP(扩展KMP,Z函数)
    Manacher算法该算法由GlennK.Manacher在1975年提出,首先注意到回文串的对称中心特性可能有所不同(中心可能为一个字符或者是在两个字符之间),那么我们将字母之间插入隔板,这两个回文串的对称中心就都在一个字符上了,suchas"|A|B|B|A|"、"|A|B|C|B|A|"过程对于一个回文串,有且......
  • 扩展 KMP/exKMP(Z 函数)
    模板链接QwQZ函数,又称扩展KMP(exkmp),可以\(O(n)\)求出一个字符串的所有后缀与这个字符串的LCP长度。怎么叫做扩展KMP但是前置知识没有KMP,Z函数的做法与Manacher有着异曲同工之妙,即存下了目前已扩展到的右端点最靠右端的后缀\(i\)与原串的LCP:\([i,i+Z[i]-1]\)......
  • KMP算法
    用于解决字符串匹配问题名词解释前缀表前缀:包含首字母不包含尾字母的所有子串比如aabaaf的前缀有aaaaabaabaaabaa后缀:包含尾字母不包含首字母的所有子串比如aabaaf的后缀有fafaafbaafabaaf最长相等前后缀:比如aabaa,最长的,相等的,前缀和后缀相等,那么这个缀......
  • KMP算法和Manacher算法
    KMP算法KMP算法解决的问题KMP算法用来解决字符串匹配问题:找到长串中短串出现的位置.KMP算法思路暴力比较与KMP的区别暴力匹配:对长串的每个位,都从头开始匹配短串的所有位.KMP算法:将短字符串前后相同的部分存储在\(next\)数组里,让之前匹配过的信息指导之后的匹配.......
  • KMP & ACAM
    KMP例:在a串中查找b串的位置。(len<=1e6)O(n2)的暴力是好想的。两层循环,第一层遍历a串,第二层遍历b串,对应比较即可。但我们会发现对于a串,我们每次都不断将循环变量i右移,可匹配失败后,又将i返回至右移之前的位置。太劣了,所以我们选择取消i的返回操作,每次用b串去匹配a串。但当b失......
  • 【kmp算法】字符串匹配
    一,解决问题kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[]中匹配模式串p[],找到匹配到的位置loc;二,具体实现和演变过程最自然的想法是暴力写法(BF)枚举主串字符s[i],和模式串p[j]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次进行比较,......
  • KMP 学习笔记
    符号规定先来规定一些符号。\(\lvertS\rvert\)代表这个字符串\(S\)的长度。\(S_{l\cdotsr}\)代表字符串从第\(l\)个字符到第\(r\)个字符组成的字串。\(F(S,i)\)等同于\(S_{1\cdotsi}\)(就是字符串长度为\(i\)的前缀)\(E(S,i)\)等同于\(S_{\lvertS\rvert-i+1......