对于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++;
    }
  }
}

总结

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

目录
相关文章
|
8月前
|
Kubernetes 算法 测试技术
【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列
【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列
|
8月前
daimayuan#436. 子串的最大差(单调栈)
daimayuan#436. 子串的最大差(单调栈)
33 0
|
算法 JavaScript 测试技术
较难理解的字符串查找算法KMP
较难理解的字符串查找算法KMP
|
8月前
|
测试技术 Perl
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
|
8月前
|
算法 测试技术 C++
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
|
8月前
KMP算next数组(2023 _ 7 _ 23 )笔记
KMP算next数组(2023 _ 7 _ 23 )笔记
54 0
|
8月前
|
算法
回溯-求出数组的所有子序列【学习算法】
回溯-求出数组的所有子序列【学习算法】
54 0
|
算法
看了这个你基本就会算kmp算法的next数组了
看了这个你基本就会算kmp算法的next数组了
|
算法 搜索推荐
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
55 0
|
存储 算法 BI
KMP算法(kmp) next数组算法解析
KMP算法(kmp) next数组算法解析
172 0
KMP算法(kmp) next数组算法解析