找到具有最多子串栅栏的字符串排列

Find the string permutation that has the most substring palidromes

本文关键字:字符串 排列 子串      更新时间:2023-10-16

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

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

我试着找到所有的排列,然后找到大多数回文子串的排列,但有1的时间限制,这样我就超过了这个限制。有人能帮我完成这项任务吗?

这是一个输入示例:

输入:

5
abccb

输出:

bcacb (one of the outputs) 

注意:我也尝试过找到能给出最多子串跑位的结构,但这种方法没有给我正确的结果。

我之前已经回答过一个类似的问题,我们如何通过重新排列字符串中的字符来获得最大数量的回文子字符串?


产生最大回文数的字符串的最佳重排可能是sorted string。以字符串abcabc为例,让n表示字符串的大小。

我们可以重新排列字符串以形成回文abc|cba,这将产生长度为n(所有单个字符(+n/2(在反射点上拾取子串(+{在任何一个反射点都存在回文的情况,在这种情况下为0}的回文子串。

我们还可以重新排列字符串以形成形式为(aa)(bb)(cc)的回文对,这将产生n(单个字符(+n/2(成对子串(+{其他可能的回文子串}回文。

类似地,3对回文也可以形成(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"))))