用一个实际的例子来说明,经历了看懂,看不懂,看懂,看不懂,看懂...后我终于决定把它记下来了。
例子字符串为:abaabaca
首先可以肯定,第一个位置永远位0,第二个位置永远为1.那么可以初始化如下表格:
a | b | a | a | b | a | c | a |
0 | 1 |
公式看起来很复杂,一步一步来说明:
首先是前缀字符和后缀字符,拿字符abcde来举例:
前缀字符有:a、ab、abc、abcd ;后缀字符有:e、de、cde、bcde;
由此可见前缀字符就是第一个字符、(第一个字符第二个字符)、... 、(第一个字符...第n-1个字符)
后缀字符就是第n个字符、(第n-1个字符第n个字符)、... 、 (第二个字符...第n个字符)
在abcde中,前缀字符与后缀字符没有相同的字符串存在,所以最大的相同字符串的长度位0;
在回到上表中的红色的a,它前面的字符串为 ab ;ab的前缀字符有 {a} ;后缀字符有{b},最大的相同字符串的长度为0,
根据公式,上表中红色的a对应的位置应当填入0+1=1;获得下表:
a | b | a | a | b | a | c | a |
0 | 1 | 1 |
上表中红色a前面的字符串为 aba; 它的前缀字符串有 {a ,ab};后缀字符串有{a,ba};最大的相同字符串的长度为1(都有相同的元素a),根据公式,上表中红色的a对应的位置应当填入1+1=2;获得下表:
a | b | a | a | b | a | c | a |
0 | 1 | 1 | 2 |
上表中红色b前面的字符串为 abaa;它的前缀字符串有{a , ab,aba};后缀字符串有{a,aa,baa};最大的相同字符串的长度为1(都有相同的元素a),根据公式,上表中红色的b对应的位置应当填入1+1=2;获得下表:
a | b | a | a | b | a | c | a |
0 | 1 | 1 | 2 | 2 |
上表中红色a前面的字符串为 abaab;它的前缀字符串有{a,ab,aba,abaa};后缀字符串有{b,ab,aab,baab};最大的相同字符串的长度为2(都有相同的元素ab),根据公式,上表中红色a对应的位置应当填入2+1=3;获得下表:
a | b | a | a | b | a | c | a |
0 | 1 | 1 | 2 | 2 | 3 |
上表中红色c前面的字符串为abaaba;它的前缀字符串有{a,ab,aba,abaa,abaab};后缀字符串有{a,ba,aba,aaba,baaba};最大的相同字符串的长度为3(都用相同的元素aba),根据公式,上表中红色a对应的位置应当填入3+1=4;获得下表:
a | b | a | a | b | a | c | a |
0 | 1 | 1 | 2 | 2 | 3 | 4 |
a | b | a | a | b | a | c | a |
0 | 1 | 1 | 2 | 2 | 3 | 4 | 1 |