一个字符串称为另一个字符串的子字符串,如果可以通过从该字符串的开头和结尾删除一些(可能为零)个字符来从该字符串获得它。
例如,abc
,ab
和c
是字符串abc
的子字符串,而ac
和d
不是。
让我们将字符串的回文计数定义为回文的子字符串数。
例如,字符串aaa
的回文计数为6,因为其所有子字符串均为回文。字符串abc
的回文计数为3,因为只有其长度为1的子字符串才是回文。
因此,还有两个示例:
如果是字符串-> oolol
answer = ololo, 9 substrings can be formed
'o', 'l', 'o', 'l', 'o', 'olo', 'lol', 'olo', 'ololo'
如果是字符串-> gagadbcgghhchbdg
answer = abccbaghghghgdfd, 29 substrings can be formed
给您一个字符串s。您可以任意重新排列其字符。您的目标是获得一个具有最大回文计数值的字符串。
答案 0 :(得分:1)
产生最大回文数的字符串的最佳可能重排可能是sorted string
。以字符串abcabc
为例,让n
总体上表示字符串的大小。
我们可以重新排列字符串以形成回文abc|cba
,它将产生长度为n(所有单个字符)+ n / 2(跨反射点的子字符串)+ {存在回文的情况)的回文子字符串在任一反射点处,在这种情况下为0}。
我们还可以重新排列字符串以形成(aa)(bb)(cc)
形式的回文对,这将产生n个(单个字符)+ n / 2个(成对子字符串)+ {其他可能的回文子字符串}回文。 / p>
类似地,也可以形成三对回文(aba)(cbc)
,在这种情况下,回文数将为n + n / 3 + {..}
很显然,随着我们形成更多的m对回文,回文子串的数量将会减少。因此,我们需要考虑案例一和案例二。在这两种情况中,最好通过增加出现在字符串中的等号字符的密度来使情况II的{other ..}情况最大化。因此,排序后的字符串应产生最佳答案。
因此,根据您的情况,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"))))