Помогите понять алгоритм ( задача с js найти подстроку полиндрома)
Я только напишу часть кода, на которой я собственно застрял. Функция expCent будет возвращать максимальную длину, на которую нам удалось сдвинуться по условиям Вопрос, как у нас передается в функции expandFromCenter наша середина(макс.длинна), если у нас итерируется одни и те же элементы , так как мы передаем их через i . то есть L=0, R=0 и так далее. , почему к примеру в слове "babad" начинает while Отрабатывать именно на середине , если у нас и до середины элементы получается одинаковые a=a .. Вообщем не пойму, как нашлась длинна по условиям while (
const palin2 = function(s) {
for (i = 0; i < s.length; i++) {
let len1 = expCent(s,i,i)
function expCent(s,L,R) {
while (L >= 0 && R < s.length && s[L] === s[R]) {
console.log(`левый - ${s[L]}, ${L} правый - ${s[R]}, ${R}`)
L--
R++
}
return R - L - 1
}
}
}
console.log(palin2('babad'))
Ответы (1 шт):
Функция expandFromCenter выполняет цикл while до тех пор, пока условия L >= 0 && R < s.length && s[L] === s[R] соблюдаются. Каждую итерацию цикла значение L уменьшается на 1, а значение R увеличивается на 1. Это означает, что функция сдвигается в обе стороны от центра (заданной через аргументы L и R).
Как только одно из условий станет невыполнимым, цикл завершится. Например, если L < 0, то функция достигла начала строки, и цикл завершится. Если R >= s.length, то функция достигла конца строки, и цикл также завершится. Если s[L] !== s[R], то цикл также завершится, так как символы не совпадают.
Каждую итерацию цикла функция сравнивает символы строки с помощью s[L] === s[R]. Если символы совпадают, то цикл продолжается, иначе цикл завершается
В следующей итерации цикла while символы s[-1] и s[5] сравниваются. Так как индекс -1 выходит за пределы строки, условие цикла while перестает соблюдаться, и цикл завершается.
Функция expandFromCenter возвращает разницу между R и L минус 1, то есть длину самого длинного палиндрома, найденного в цикле while. Это значение записывается в переменную len1.
Ваш код содержит еще один цикл for, который итерируется от 0 до s.length. Внутри этого цикла вызывается функция expandFromCenter с аргументами L и R, равными i и i+1 соответственно. Это означает, что функция expandFromCenter вызывается для каждой пары соседних символов в строке. Она находит самый длинный палиндром, начинающийся с этой пары соседних символов.
