Допустим, мы анализируем массив символов с i
и j
, расположенными так:
a b a b x x a b a b ...
^ ^
j i
с arr
, удерживая:
0 0 1 2 0 0 1 2 3 4
т.е. длина самого длинного префикса / суффикса каждой подстроки s этой длины до i
. Вы, вероятно, можете догадаться, как это было сгенерировано из остальной части алгоритма. Теперь, если следующий символ после i
не соответствует следующему символу после j
,
a b a b x x a b a b a ...
^ ^
j i
, нам не нужно повторять сопоставление, потому что мы знаем самый длинный префикс / суффикс нашего предыдущего префикса / суффикса! При поиске arr[j - 1]
получается 2 - поэтому мы по существу кэшировали информацию о том, что выделенные здесь части
A B a b x x a b A B a ...
=== ^ === ^
j i
идентичны и их не нужно сравнивать снова!