【数据结构】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
```
相关推荐
aichitang20243 分钟前
矩阵详解:从基础概念到实际应用
线性代数·算法·矩阵
OpenCSG1 小时前
电子行业AI赋能软件开发经典案例——某金融软件公司
人工智能·算法·金融·开源
dfsj660112 小时前
LLMs 系列科普文(14)
人工智能·深度学习·算法
薛定谔的算法2 小时前
《盗梦空间》与JavaScript中的递归
算法
kaiaaaa2 小时前
算法训练第十一天
数据结构·算法
?!7143 小时前
算法打卡第18天
c++·算法
springfe01013 小时前
构建大顶堆
前端·算法
凌辰揽月3 小时前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
lifallen3 小时前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
jingfeng5143 小时前
数据结构排序
数据结构·算法·排序算法