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"))))