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


目录
相关文章
|
Java
解决Java- 错误: 找不到或无法加载主类 HelloWorld.java
针对初学者使用javac,java等命令编译class文件时出现的经典问题,提供解决思路和方法。
11220 98
解决Java- 错误: 找不到或无法加载主类 HelloWorld.java
|
存储
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
10767 1
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
524 1
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
991 5
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
算法
串ababaaababaa的next和串ababaabab的nextval
本文介绍了计算字符串的next数组和nextval数组的方法,通过分析两个具体的例子来展示如何计算这些数组,这些数组通常用于KMP算法中。
1165 1
串ababaaababaa的next和串ababaabab的nextval
|
编译器
区分LR(0),SLR(1),LR(1)和LALR(1)
区分LR(0),SLR(1),LR(1)和LALR(1)
2364 1
|
数据库 C++
【数据结构进阶】红黑树超详解 + 实现(附源码)
本文深入探讨了红黑树的实现原理与特性。红黑树是一种自平衡二叉搜索树,通过节点着色(红/黑)和特定规则,确保树的高度接近平衡,从而实现高效的插入、删除和查找操作。相比AVL树,红黑树允许一定程度的不平衡,减少了旋转调整次数,提升了动态操作性能。文章详细解析了红黑树的性质、插入时的平衡调整(变色与旋转)、查找逻辑以及合法性检查,并提供了完整的C++代码实现。红黑树在操作系统和数据库中广泛应用,其设计兼顾效率与复杂性的平衡。
3092 3
|
人工智能 测试技术 API
Ollama本地模型部署+API接口调试超详细指南
本文介绍了如何使用Ollama工具下载并部署AI大模型(如DeepSeek-R1、Llama 3.2等)。首先,访问Ollama的官方GitHub页面下载适合系统的版本并安装。接着,在终端输入`ollama`命令验证安装是否成功。然后,通过命令如`ollama run Llama3.2`下载所需的AI模型。下载完成后,可以在控制台与AI模型进行对话,或通过快捷键`control+d`结束会话。为了更方便地与AI互动,可以安装GUI或Web界面。此外,Ollama还提供了API接口,默认支持API调用,用户可以通过Apifox等工具调试这些API。

热门文章

最新文章