【数据结构】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数组

nextval1=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
```
相关推荐
地平线开发者4 小时前
J6B vio scenario sample
算法
BothSavage16 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn16 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽18 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰2 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术2 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六2 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程