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


目录
相关文章
|
算法 C++ 索引
【算法】——全排列算法讲解
【算法】——全排列算法讲解
633 0
|
存储 编译器 C语言
计算机组成与体系结构期末题目解析
计算机组成与体系结构期末题目解析
2449 0
计算机组成与体系结构期末题目解析
|
JavaScript 前端开发
JavaScript中的var变量详解:定义、提升与注意事项
JavaScript中的var变量详解:定义、提升与注意事项
351 2
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
自然语言处理 编译器 C语言
转义字符使用详解【C语言】
转义字符使用详解【C语言】
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
254 1
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
|
监控 IDE 物联网
使用ESP32和OV2640进行图传
本文详细介绍了如何使用ESP32和OV2640进行图像传输。通过硬件连接、软件配置和编程实现,我们可以轻松地将摄像头捕捉的图像通过WiFi传输到浏览器中进行查看。这一技术在智能家居、安防监控等领域具有广阔的应用前景。希望这篇文章能为您提供有价值的参考。
2255 2
|
网络协议 网络架构
IP地址划分知识点总结
IP地址划分知识点总结
560 1
|
机器学习/深度学习 资源调度 PyTorch
【从零开始学习深度学习】15. Pytorch实战Kaggle比赛:房价预测案例【含数据集与源码】
【从零开始学习深度学习】15. Pytorch实战Kaggle比赛:房价预测案例【含数据集与源码】
|
存储
数据结构-树的介绍、树的定义和基本术语
树是一种非线性的数据结构,是以分支关系定义的层次结构,比如人类社会中的族谱、及各种机制、组织的关系都可以用树形象的表示。重点学习二叉树的存储和相关操作,还要讨论树、森林、二叉树的转换关系。
337 0