目录
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
```