查找具有最多子字符串回文率的字符串排列

时间:2018-10-25 11:11:28

标签: java python c++ algorithm sorting

对于我的Algorithms类,我有以下分配;这是一个排序作业,所以我怀疑我必须使用某种排序算法。

  

查找具有最多子字符串回文率的字符串排列。输入数据为N(字符串的长度)和字符串s1 < N < 2000)。输出数据应该是回文最多的子字符串。 (如果还有更多包含相同数量的内容,请打印任何人。)

我尝试找到所有排列,然后找到大多数回文子串的排列,但是时间限制为1s,因此我超出了该限制。有人可以帮我完成这项任务吗?

这是一个输入示例:

输入:

5
abccb

输出:

bcacb (one of the outputs) 

注意:我还尝试过找到能提供最多子串回文的结构,但那样的话并没有给我正确的结果。

1 个答案:

答案 0 :(得分:1)

我之前已经回答过类似的问题,How can we make maximum number of palindromic substrings by rearranging the characters in a string?


产生最大回文数的字符串的最佳可能重排可能是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"))))