Поскольку вы уже знаете алгоритм поиска всех палиндромов (что кстати довольно круто), все, что вам нужно сделать, это следующее.Обратите внимание, что «двойной палиндром» также является палиндромом:
реверс (PP) = реверс (P) реверс (P) = PP.
Таким образом, среди всех палиндромов (a,b)
вы найдете (где по (a,b)
Я имею в виду палиндром из положения a
в положение b
), вам нужно найти (i,j,k)
такой, что (i,j)
, (j,k)
и (i,k)
- все палиндромы и j-i=k-j
.Эквивалентно, для каждого найденного вами палиндрома (i,j)
вам просто нужно установить k = 2j-i
и проверить, являются ли (k,j)
и (i,k)
палиндромами.
Если первый шаг возвращает M палиндромов всего,на это уходит O (M) времени (при условии, что вы сохранили их таким образом, чтобы проверить, существует ли палиндром, является O (1)), поэтому O (n 2 ) в худшем случае.Я считаю, что это должно быть оптимальным в худшем случае (рассмотрим строку всех 1).