Текущее время выполнения решения - O (n ^ 4). Вы можете уменьшить его до O (n ^ 2logn), удалив количество символов в подстроках и оптимизировав часть проверки палиндрома.
Для этого вам нужно предварительно вычислить массив, скажем "counter", где каждая позиция массива «counter» указывает количество различных символов от начального индекса до этой позиции.
После построения массива вы можете проверить, имеет ли подстрока более двух символов в O (1), вычитая конечная позиция и значение начальной позиции массива счетчиков. Если значение равно 1, то в подстроке будет только один символ. Если значение равно 2, то вы можете выполнить двоичный поиск в массиве счетчиков между начальной и конечной позициями подстрок, чтобы найти позицию одного символа. После выяснения положения одиночного символа его прямо вперед, чтобы проверить, является ли подстрока палиндром или нет.
ОБНОВЛЕНИЕ! Позвольте мне объяснить на примере:
Предположим, строка "aaabaaa". Таким образом, массив счетчиков будет = [1, 1, 1, 2, 2, 2, 2]; Теперь давайте предположим, что в течение определенного c времени, внешнее значение для циклов i = 1 и внутреннее значение для циклов j = 5; поэтому подстрока "aabaa". Теперь, чтобы найти количество символов в подстроке с помощью следующего кода:
noOfDifferentCharacter = counter[j] - counter[i-1] + 1
Если noOfDifferentCharacter равен 1, тогда нет необходимости проверять палиндром. Если noOfDifferentCharacter равно 2, как в нашем случае, нам нужно проверить, является ли подстрока палиндромом. Чтобы проверить, является ли подстрока палиндромной, необходимо выполнить двоичный поиск в массиве счетчиков от индекса i до j, чтобы проверить позицию, где значение больше, чем его предыдущий индекс. В нашем случае позиция равна 3, тогда вам просто нужно проверить, является ли позиция средней позицией подстроки. Обратите внимание, что массив счетчиков отсортирован.
Надеюсь, это поможет. Дай мне знать, если не поймешь ни одного шага. Удачного кодирования!