Arrays 如何通过重新排列字符串中的字符来获得最大数量的回文子字符串?
一个字符串称为另一个字符串的子字符串,如果可以从该字符串的开头和结尾删除一些(可能为零)字符来获取该字符串 例如,Arrays 如何通过重新排列字符串中的字符来获得最大数量的回文子字符串?,arrays,string,substring,dynamic-programming,palindrome,Arrays,String,Substring,Dynamic Programming,Palindrome,一个字符串称为另一个字符串的子字符串,如果可以从该字符串的开头和结尾删除一些(可能为零)字符来获取该字符串 例如,abc、ab和c是字符串abc的子字符串,而ac和d不是 让我们将字符串的回文计数定义为其回文子字符串的数量 例如,字符串aaa的回文计数为6,因为它的所有子字符串都是回文。字符串abc的回文计数为3,因为只有其长度为1的子字符串是回文 还有两个例子: 如果字符串->oolol answer = ololo, 9 substrings can be formed 'o', 'l',
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。您可以任意重新排列其字符。您的目标是获得具有最大可能值的回文计数的字符串。产生最大回文数的字符串的最佳可能重排可能是排序字符串的重排。以字符串
abcabc
为例,让n
表示一般字符串的大小
我们可以重新排列字符串以形成回文abc|cba
,这将产生长度为n(所有单字符)+n/2(在反射点上拾取子字符串)+{在反射点的任何一个存在回文的情况下,在本例中为0}的回文子字符串
我们还可以重新排列字符串以形成(aa)(bb)(cc)
形式的回文对,这将产生n(单字符)+n/2(成对子串)+{其他可能的回文子串}回文组
类似地,也可以形成3对回文组(aba)(cbc)
,在这种情况下,回文组的数量将为n+n/3+{..}
显然,当我们形成更多的m-配对回文时,回文子串的数量将会减少。因此,我们需要考虑案例I和案例II。在这两种情况中,最好通过增加一起出现的相等字符的密度来最大化情况II的{other..}情况,这是排序字符串中的情况。因此,排序后的字符串应产生最佳答案
因此,在您的案例中,oolol
->llooo
将给出9的最佳结果,gagadbccgghhchbdg
->aabbccddfggghhh
也将给出29的最佳结果。您可以使用以下代码检查任何字符串:
难道你不应该自己做作业吗?我已经试了很多次了,但都没能找到答案solution@PrateekAgarwal我的方法解决了你的问题吗?@nellex我编辑了我的问题,我必须找到回文数最大的一个重排。我不想检查每一个可能的宫殿式的重新安排。我只是想从一个回文数最大的序列中进行一次重新排列。如果您对此有解决方案,请发表意见。顺便谢谢你早些时候的邀请approach@Neo,我已经在回答中提出了最佳解决方案。我对它进行了编辑,使它更详细。请看一看,如果还有疑问请告诉我。
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"))))