Наилучшая возможная перестановка строки, которая дает максимальное количество палиндромов, может быть таковой для sorted string
.Возьмем, например, строку abcabc
и пусть n
обозначает размер строки в целом.
Мы можем переставить строку, чтобы сформировать палиндром abc|cba
, который даст палиндромные подстроки длины n (все одиночные символы) + n / 2 (выбор подстроки через точку отражения) + {случаи, когда существуетпалиндром в любой точке отражения, которая в данном случае равна 0}.
Мы также можем переставить строку для формирования палиндромных пар вида (aa)(bb)(cc)
, что даст n (одинарные символы) + n / 2 (попарно подстрока) + {другие возможные палиндромные подстроки} палиндромы.
Точно так же можно сформировать 3-парный палиндром (aba)(cbc)
, и тогда число палиндромов будет равно n + n / 3 + {..}
Очевидно, что примы формируем более м-парный палиндром, количество палиндромных подстрок будет падать.Следовательно, мы должны рассмотреть Случай I и Случай II.Из этих двух вариантов лучше максимально использовать случай {other ..} для Case II путем увеличения плотности одинаковых символов, появляющихся вместе, как в случае отсортированной строки.Следовательно, отсортированная строка должна дать оптимальный ответ.
Следовательно, для вашего случая oolol
-> llooo
даст оптимальный результат 9, а gagadbcgghhchbdg
-> aabbccddfgggghhh
даст оптимальный результатиз 29, а также.Вы можете проверить любую строку, используя этот код: https://ideone.com/mMu2tq
def ispalin(s):
return (s == s[::-1])
def cpalin(s):
c = 0
for i in range(len(s)):
for j in range(i, len(s)):
if ispalin(s[i:j + 1]):
c += 1
return c
print(cpalin(''.join(sorted("abccbaghghghgdfd"))))
print(cpalin(''.join(sorted("oolol"))))