Хорошо, скажем, мы хотим найти палиндром s, когда s = 'abba'.
примечание: Думайте о расширении как о палиндромном искателе, который берет центральный индекс. Имейте в виду, что позже я объясню, как работает расширение.
Мы сместим центр расширения с 0 до 3 (окончательный индекс). Во-первых, он проверяет расширение от begin = 0 и end = 0.
s = 'abba'
Если begin = 0 и end = 0, расширение возвращает «a».
v___
abba //only the palindrome from 0 is 'a'
Если begin = 0 и end = 1, расширение возвращает ''.
_v___
a bba //there are no palindrome from between 0 and 1
Если begin = 1 и end = 1, расширение возвращает 'b'.
_v__
abba //only the palindrome from 1 is 'b'
Если начало = 1 и конец = 2, расширение возвращает «abba».
__v__
ab ba //the palindrome from between b and b is 'abba'
Если начало = 2 и конец = 2, расширение возвращает «b».
Если begin = 2 и end = 3, расширение возвращает ''.
Если begin = 3 и end = 3, расширение возвращает 'a'.
На этом этапе мы Протестировал все возможные палиндромы с. Наконец, код возвращает самый длинный палиндром на данный момент, который в данном случае будет «abba».
Обратите внимание, почему нам нужно выполнить расширение дважды. При i = 1 мы можем искать палиндром из центра.
_v__
abba
Но также с места между b и b
__v__
ab ba
Бывшие возвраты 'b' в то время как последний возвращает «abba». Вот почему вам нужно выполнить 2 расширения для каждого i.
Теперь, что именно происходит внутри функции расширения? Давайте использовать пример. s = 'aacdeedcba', а begin = 4 и end = 5.
Сначала l oop сначала проверяет, есть ли s [begin] == s [end].
____vv____
aacdeedcba
Очевидно, что 'e' === 'e' верно, поэтому мы начнем с левой стороны, а с правой стороны.
Снова мы проверим, s [начало] === s [конец].
___v__v____
aacdeedcba
Опять «d» === «d» верно, поэтому мы Сместим начало в левую сторону и конец в правую сторону.
мы проверим еще раз.
__v____v__
aacdeedcba
Снова, 'c' === 'c' - истина, поэтому мы сместимся и начнем с левой стороны, и конец к правой стороне.
мы проверим еще раз.
_v______v_
aacdeedcba
На этот раз 'a' === 'b' не соответствует действительности. Так что пока l oop остановлен. И функция расширения возвращает 'cdeed c'.