对于KMP的next数组的新发现,好像我们并不用回溯

简介: 对于KMP的next数组的新发现,好像我们并不用回溯

目录

前言

发现

总结

博客主页:张栩睿的博客主页

欢迎关注:点赞+收藏+留言

系列专栏:c语言学习

       家人们写博客真的很花时间的,你们的点赞和关注对我真的很重要,希望各位路过的朋友们能多多点赞并关注我,我会随时互关的,欢迎你们的私信提问,也期待你们的转发!

       希望大家关注我,你们将会看到更多精彩的内容!!!

前言

       学了一个下午的KMP算法,一直弄不明白为什么next数组的那个回溯:k=next[k],喜欢钻牛角尖的我一直到处查啊查啊,但是当我仔细观察next数组,并多举了几个例子以后,才发现回溯的意义。

发现:

       通过大量的举例子发现,next数组,要么就是0 0 0 0,要么就是0 1 2 3...递增之后,直接跳回0或1,元素0后面的元素,会非递减,元素1后面的元素,不是0就是2,非0元素后面,要么是直接变为0或1,要么就递增。想到这里,我就发现如果在递增的时候发生不相同的情况,发生回溯,就会一直回溯到首元素,因为我们会惊奇的发现元素通过回溯,他的值没有发生改变!所以代码我们可以写成这样,就不用回溯了!因为回溯的本质就是找到首元素!

       从这里我们就可以看到这些规律

void GetNext(int* next, char* sub)
{
  next[0] = -1;
  if (strlen(sub) == 1)
    return;
  next[1] = 0;
  int k = 0;
  int i = 2;
  while (i < strlen(sub))
  {
    if (sub[i - 1] == sub[k])
    {
      next[i] = k + 1;
      i++;
      k++;
    }
    else if(sub[0]==sub[i-1])
    {
      sub[i]=1;
      i++;
      k++;
    }
    else if (sub[0] != sub[i - 1])
    {
      sub[i] = 0;
      i++;
      k++;
    }
  }
}

总结

       算法太难了!大家一定要好好学习呜呜呜辛苦各位小伙伴们动动小手,三连走一波 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

目录
相关文章
|
6月前
|
Kubernetes 算法 测试技术
【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列
【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列
|
6月前
|
测试技术 Perl
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
|
6月前
|
算法 C++ 索引
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
78 0
|
1月前
|
算法
KMP算法
KMP算法
23 0
|
6月前
|
机器学习/深度学习 算法 测试技术
【字符串】【分类讨论】【KMP】1163. 按字典序排在最后的子串
【字符串】【分类讨论】【KMP】1163. 按字典序排在最后的子串
|
6月前
|
分布式计算 测试技术 索引
【数位dp】【动态规划】【KMP】1397. 找到所有好字符串
【数位dp】【动态规划】【KMP】1397. 找到所有好字符串
|
6月前
KMP算next数组(2023 _ 7 _ 23 )笔记
KMP算next数组(2023 _ 7 _ 23 )笔记
42 0
|
C语言
next数组的两种求法详解及完整代码
求字符串的next数组: 方法一: 这里我们将next数组第1,2位分别设为0,1(还有-1,0这种设法,这里先将其设为0,1若有需要再减一即可) 后面求解每一位的next值时,根据前一位进行比较。 从第三位开始,将前一位与其next值对应的内容进行比较, 如果相等,则该位的next值就是前一位的next值加上1; 如果不等,向前继续寻找next值对应的内容来与前一位进行比较, 直到找到某个位上内容的next值对应的内容与前一位相等为止, 则这个位对应的值加上1即为需求的next值; 如果找到第一位都没有
365 0
next数组的两种求法详解及完整代码
|
12月前
|
存储 算法 C语言
【KMP算法】
【KMP算法】
72 1
|
算法
看了这个你基本就会算kmp算法的next数组了
看了这个你基本就会算kmp算法的next数组了