让我们先看这样一道题:
光题目就让人头皮发麻,这道题的传统解法是这样的:
已经完全看不懂了吧quq,没事下面教大家用三段式轻松解决这类问题!
我们先列这样一个三段式表格:
S | a | b | a | a | c |
PM | |||||
next-1 | |||||
next |
- pm:重复对称的字母个数;
- next-1:初值为-1的next数组;
- next:初值为0的next数组(要求的);
首先先创建一个空的字母队列
然后把a拿进来,重复对称的字母个数是0;
a
S | a | b | a | a | c |
PM | 0 | ||||
next-1 | |||||
next |
再把第二个字母b拿进来,这时候是ab,重复的字母个数还是为0个;
ab
S | a | b | a | a | c |
PM | 0 | 0 | |||
next-1 | |||||
next |
这时候把第三个字母a拿进来,这时候是aba,两个a关于b对齐,重复对称的字母就是a;
aba
那么此时重复的字母个数是1个;
S | a | b | a | a | c |
PM | 0 | 0 | 1 | ||
next-1 | |||||
next |
把第四个字母a拿进来,这时候字母a关于ba对称,重复对称的字母个数为1;
abaa
S | a | b | a | a | c |
PM | 0 | 0 | 1 | 1 | |
next-1 | |||||
next |
把第5个字母c拿进来,没有重复对称的字母了,个数为0;
abaac
S | a | b | a | a | c |
PM | 0 | 0 | 1 | 1 | 0 |
next-1 | |||||
next |
next-1里面的数就是PM的数往右边整体挪一位;空的位置填上-1,如下表:
S | a | b | a | a | c |
PM | 0 | 0 | 1 | 1 | 0 |
next-1 | -1 | 0 | 0 | 1 | 1 |
next |
next里面的数就是next-1里的数整体加一;
S | a | b | a | a | c |
PM | 0 | 0 | 1 | 1 | 0 |
next-1 | -1 | 0 | 0 | 1 | 1 |
next | 0 | 1 | 1 | 2 | 2 |