先写一点,慢慢补充
先记一个最重要的问题:计算next数组
这也是考试的重点
先看下如何手算next数组
了解两个概念:
- 串的前缀 :包含第一个字符,且不包含最后一个字符的子串
- 串的后缀 :包含最后一个字符,且不包含第一个字符的子串
举个例子:{a,b,a} 前缀是{a} {a,b} 后缀是{a} {b,a} 最长相等前后缀长度是1
计算公式:第i个字符的next数组数值=前边 i-1 个字符组成的子串的最长相等前后缀长度+1
规定第一个位置的next数组值是 0
注意:这个公式适用字符串下标从1开始的 若下标从0开始 则改成从1开始计算next数组,再全部减1就好
举个简单点的例子:串{a,a,a,b} 字符串下标从1开始
当指针指向第1个字符的时候,不用算,第一个next是0
当指针指向第2个字符的时候,当前位置前边就一个{a} 他没有前后缀,故最长相等前后缀长度就是0咯,next值为1
所以,第二个位置其实也不用算,永远都是1
当指针指向第3个字符的时候,当前位置前边的字符是{a,a},这个串有一个前缀{a} 一个后缀{a},最长相等前后缀长度就是1,故next数值是2
当指针指向第4个字符的时候,当前位置前边的字符是{a,a,a},这个串的前缀有{a} {a,a},后缀有{a} {a,a},最长相等前后缀长度就是2,next数值为3
故串{a,a,a,b}的next数组为
下标 | 1 | 2 | 3 | 4 |
字符 | a | a | a | b |
next | 0 | 1 | 2 | 3 |
有的时候,题目告诉你,字符串数组下标从0开始
比如串{a,b,a,a,b,c} 下标从0开始,求next数组
我们先把他按作下标从1开始的计算
前缀 | 后缀 | |
第一个 | ||
第二个 | ||
第三个 | {a} | {b} |
第四个 | {a} {a,b} | {a} {b,a} |
第五个 | {a} {a,b} {a,b,a} | {a} {a,a} {b,a,a} |
第六个 | {a} {a,b} {a,b,a} {a,b,a,a} | {b} {a,b} {a,a,b} {b,a,a,b} |
当指针指向第1个字符的时候,next= 0
当指针指向第2个字符的时候,next=1
当指针指向第3个字符的时候,next=0+1=1
当指针指向第4个字符的时候,next=1+1=2
当指针指向第5个字符的时候,next=1+1=2
当指针指向第6个字符的时候,next=2+1=3
下标 | 1 | 2 | 3 | 4 | 5 | 6 |
字符 | a | b | a | a | b | c |
next | 0 | 1 | 1 | 2 | 2 | 3 |
由于下标是从0开始的,所以全部减1才是答案
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
字符 | a | b | a | a | b | c |
next | -1 | 0 | 0 | 1 | 1 | 2 |