找到具有最多子串栅栏的字符串排列
Find the string permutation that has the most substring palidromes
对于我的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"))))
- 找到具有最多子串栅栏的字符串排列
- 为什么我得到长度仅为 3 的字符串排列的输出?
- 如何排列二进制字符串以最小化它们之间的距离
- C++按字母顺序排列的字符串数组
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何在 c++ 中按字母顺序排列数组中的字符串?
- 在c++中生成字符串的排列
- 从给定字符串中查找长度 k 的所有排列/组合
- C++ 字符串的排列,输出的结果小于或等于字符串的长度
- 生成具有条件的给定字符串的排列
- 从左到右打印字符串的组合(不是排列)c++
- 如何找到通过仅移动相邻字符创建的字符串的排列?-C++
- 如何在C++中分隔和排列名字和全名字符串
- 如何从长度为 n 的字符串中获取 lengh k 的所有唯一排列的数量
- 它如何排列单词以使用 qsort 和字符串
- 非递归二进制字符串排列生成器
- 生成没有重复项的字符串排列
- 字符串排列:如何去除重复排列
- 什么是可以高效打印字符串排列的算法?
- 字符串排列