【数据结构】next数组、nextval数组

目录

next数组的求解方法:

nextval数组的求解方法:


next数组的求解方法:

1.第一位的next值为0

2.第二位的next值为1

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

从第三位开始,比较前一位元素和其next值对应的元素是否相等

相等,所求的next值就是前一位的next值+1

不相等,则向前继续寻找next值对应的元素与前一位进行比较,直到找到与前一位相同的元素;若找到,则找到的这个位置的next值+1,就是所求的next值;若直到第一个元素,都没有找到与前一位元素相同的,则所求next值为0

nextval数组的求解方法:

利用next数组求nextval数组

nextval[1]=0;

从第二位开始,依次判断该位置的next值对应的元素与该位置的元素是否相同

相同,该位置的nextval的值就是在该位置next值对应元素的nextval的值

不相同,该位置的nextval的值就是该位置的next值

复制代码
模式串 `ababc` 的 **next数组** 和 **nextval数组** 的计算步骤如下:

### 1. 计算next数组:
- **规则**:对于位置 `j`,找到其前 `j-1` 个字符的最长相等前后缀长度,再加1。
- **过程**:
  - `next[1] = 0`(规定)。
  - `next[2] = 1`(规定)。
  - `j=3`:子串 `ab` 无公共前后缀,`next[3] = 0 + 1 = 1`。
  - `j=4`:子串 `aba` 的最长公共前后缀为 `a`(长度1),`next[4] = 1 + 1 = 2`。
  - `j=5`:子串 `abab` 的最长公共前后缀为 `ab`(长度2),`next[5] = 2 + 1 = 3`。
- **结果**:`next = [0, 1, 1, 2, 3]`

### 2. 计算nextval数组:
- **规则**:若 `p[j] == p[next[j]]`,则 `nextval[j] = nextval[next[j]]`;否则 `nextval[j] = next[j]`。
- **过程**:
  - `nextval[1] = 0`(规定)。
  - `j=2`:`p[2] = b`,`p[next[2]] = p[1] = a`,不等,故 `nextval[2] = next[2] = 1`。
  - `j=3`:`p[3] = a`,`p[next[3]] = p[1] = a`,相等,故 `nextval[3] = nextval[1] = 0`。
  - `j=4`:`p[4] = b`,`p[next[4]] = p[2] = b`,相等,故 `nextval[4] = nextval[2] = 1`。
  - `j=5`:`p[5] = c`,`p[next[5]] = p[3] = a`,不等,故 `nextval[5] = next[5] = 3`。
- **结果**:`nextval = [0, 1, 0, 1, 3]`

### 最终答案:
- **next数组**:`[0, 1, 1, 2, 3]`
- **nextval数组**:`[0, 1, 0, 1, 3]`

```plaintext
next数组:0 1 1 2 3
nextval数组:0 1 0 1 3
```
相关推荐
威视锐科技31 分钟前
软件定义无线电36
网络·网络协议·算法·fpga开发·架构·信息与通信
牧歌悠悠1 小时前
【Python 算法】动态规划
python·算法·动态规划
JINX的诅咒1 小时前
CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案
算法·数学建模·fpga开发·架构·信号处理·硬件加速器
明天不下雨(牛客同名)2 小时前
为什么 ThreadLocalMap 的 key 是弱引用 value是强引用
java·jvm·算法
lisw052 小时前
DeepSeek原生稀疏注意力(Native Sparse Attention, NSA)算法介绍
人工智能·深度学习·算法
喝拿铁写前端3 小时前
SmartField AI:让每个字段都找到归属!
前端·算法
莫有杯子的龙潭峡谷3 小时前
3.31 代码随想录第三十一天打卡
c++·算法
LuckyLay4 小时前
LeetCode算法题(Go语言实现)_22
算法·leetcode·golang
BingLin-Liu4 小时前
蓝桥杯备考---》贪心算法之矩阵消除游戏
算法·游戏·贪心算法
山河君5 小时前
音频进阶学习二十四——IIR滤波器设计方法
学习·算法·音视频·信号处理