【数据结构】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
```
相关推荐
穿条秋裤到处跑几秒前
每日一道leetcode(2026.04.10):三个相等元素之间的最小距离 I
算法·leetcode
nlpming11 分钟前
OpenClaw 代码解析
算法
学习永无止境@14 分钟前
MATLAB中矩阵转置
算法·matlab·fpga开发·矩阵
七颗糖很甜14 分钟前
雨滴谱数据深度解析——从原始变量到科学产品的Python实现【下篇】
python·算法·pandas
nlpming15 分钟前
OpenClaw system prompt定义
算法
nlpming15 分钟前
OpenClaw安装配置及简介
算法
爱码小白16 分钟前
MySQL 常用数据类型的系统总结
数据库·python·算法
玛丽莲茼蒿23 分钟前
Leetcode hot100 【中等】括号生成
算法·leetcode·职场和发展
小欣加油25 分钟前
leetcode 128 最长连续序列
c++·算法·leetcode·职场和发展
汀、人工智能38 分钟前
[特殊字符] 第94课:删除无效的括号
数据结构·算法·数据库架构·图论·bfs·删除无效的括号