我们如何通过重新排列字符串中的字符来使回文子字符串的数量最大化?

时间:2018-10-17 15:26:32

标签: arrays string substring dynamic-programming palindrome

一个字符串称为另一个字符串的子字符串,如果可以通过从该字符串的开头和结尾删除一些(可能为零)个字符来从该字符串获得它。

例如,abcabc是字符串abc的子字符串,而acd不是。

让我们将字符串的回文计数定义为回文的子字符串数。

例如,字符串aaa的回文计数为6,因为其所有子字符串均为回文。字符串abc的回文计数为3,因为只有其长度为1的子字符串才是回文。

因此,还有两个示例:

  1. 如果是字符串-> oolol

    answer = ololo,  9 substrings can be formed
    'o', 'l', 'o', 'l', 'o', 'olo', 'lol', 'olo', 'ololo'
    
  2. 如果是字符串-> gagadbcgghhchbdg

    answer = abccbaghghghgdfd, 29 substrings can be formed
    

给您一个字符串s。您可以任意重新排列其字符。您的目标是获得一个具有最大回文计数值的字符串。

1 个答案:

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