next数组的两种求法详解及完整代码

简介: 求字符串的next数组:方法一:这里我们将next数组第1,2位分别设为0,1(还有-1,0这种设法,这里先将其设为0,1若有需要再减一即可)后面求解每一位的next值时,根据前一位进行比较。从第三位开始,将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有

 🌹作者:云小逸

📝个人主页:云小逸的主页

📝码云:云小逸 (YunXiaoYi003) - Gitee.com

🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。希望春天来之前,我们一起面朝大海,春暖花开!🤟

👏专栏:C语言初阶👏日常杂记👏

求字符串的next数组:

方法一:

这里我们将next数组第1,2位分别设为0,1(还有-1,0这种设法,这里先将其设为0,1若有需要再减一即可)

后面求解每一位的next值时,根据前一位进行比较。

从第三位开始,将前一位与其next值对应的内容进行比较,

如果相等,则该位的next值就是前一位的next值加上1;

如果不等,向前继续寻找next值对应的内容来与前一位进行比较,

直到找到某个位上内容的next值对应的内容与前一位相等为止,

则这个位对应的值加上1即为需求的next值;

如果找到第一位都没有找到与前一位相等的内容,那么求解的位上的next值为1。

总结:相等则加一,不等则向前寻找,找到加一,找不到为一。

方法二:

1.先求前缀后缀最长公共元素长度 。“前缀后缀最长公共元素长度”这个名词可能比较难懂,稍安勿躁,且听本公子(*^▽^*)娓娓道来:

image.gif编辑

(请多多关注,三连,图自己一笔一画画的φ(>ω<*) 创作不易)

image.gif编辑

2.将各个对应的前缀后缀最长公共元素长度 整体向后移一位,将第一位设为-1。就得到了其的next数组(第1,2位-1,0的情况)

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void prefix_table(char pattern[], int prefix[], int n)//求出next数组
{
  prefix[0] = 0;
  int len = 0;
  int i = 1;
  while (i < n)
  {
    if (pattern[i] == pattern[len])
    {
      len++;
      prefix[i] = len;
      i++;
    }
    else
    {
      if (len > 0)
      {
        len = prefix[i];
      }
      else
      {
        prefix[i] = len;
        i++;
      }
    }
  }
}
void move_prefix_table(int prefix[], int n)//向后移动next数组
{
  int i;
  for (i = n - 1; i > 0; i--)
    prefix[i] = prefix[i-1];
  prefix[0] = -1;
}
int main(void)
{
  char pattern[] = "ABABCABAA";
  int n = 9;
  int prefix[9]={0};
  prefix_table(pattern, prefix, n);
  move_prefix_table(prefix, n);
  int i;
  for (i = 0; i < n; i++)
  {
    printf("%d   ", prefix[i]);
  }
  return 0;
}

image.gif

image.gif


目录
相关文章
|
IDE Java 开发工具
java编译通过,运行却提示找不到或无法加载主类的解决方案
java编译通过,运行却提示找不到或无法加载主类的解决方案
3017 0
|
存储
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
12060 1
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
|
并行计算 Ubuntu 机器人
计算机视觉教程7-3:Openpose配置与实践
计算机视觉教程7-3:Openpose配置与实践
3781 0
计算机视觉教程7-3:Openpose配置与实践
|
7月前
|
JSON 监控 小程序
淘宝商品详情 API(taobao.item.get)完整使用教程
从 0 到 1 手把手教你调用、解析、落地业务 适配场景:无货源代发、闲鱼铺货、ERP 同步、导购小程序、比价工具
|
人工智能 自然语言处理 监控
构建智能客服Agent:从需求分析到生产部署
本文将结合我在多个智能客服项目中的实践经验,从需求分析、系统设计、核心算法实现到生产部署的完整技术链路进行深度剖析。文章重点关注客服场景的需求建模、多轮对话的上下文维护、知识库的动态集成以及人机协作的智能切换机制。通过详实的代码实现、丰富的技术图表和量化的性能评测,帮助读者构建一个真正适用于生产环境的智能客服Agent系统。这套技术方案已在多家大型企业成功落地,处理日均对话量超过10万次,为企业节省人力成本60%以上。
3318 3
|
算法
串ababaaababaa的next和串ababaabab的nextval
本文介绍了计算字符串的next数组和nextval数组的方法,通过分析两个具体的例子来展示如何计算这些数组,这些数组通常用于KMP算法中。
1500 1
串ababaaababaa的next和串ababaabab的nextval
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
数据库 C++
【数据结构进阶】红黑树超详解 + 实现(附源码)
本文深入探讨了红黑树的实现原理与特性。红黑树是一种自平衡二叉搜索树,通过节点着色(红/黑)和特定规则,确保树的高度接近平衡,从而实现高效的插入、删除和查找操作。相比AVL树,红黑树允许一定程度的不平衡,减少了旋转调整次数,提升了动态操作性能。文章详细解析了红黑树的性质、插入时的平衡调整(变色与旋转)、查找逻辑以及合法性检查,并提供了完整的C++代码实现。红黑树在操作系统和数据库中广泛应用,其设计兼顾效率与复杂性的平衡。
4375 3
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
1251 5
|
算法 Java C语言
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
5155 1