在Python中从排列中查找回文

在Python中从排列中查找回文,python,algorithm,permutation,palindrome,Python,Algorithm,Permutation,Palindrome,我有一个字符串,我需要找出长度为4的回文子字符串(all4个索引子字符串),其中索引应按升序排列(index1如果您想坚持当前算法的基本结构,有几种加速方法可以使用组合而不是排列,它们将按排序顺序返回一个iterable。这意味着您不需要检查索引是否按升序排列。其次,您可以加速bi它通过简单地检查前两个字符是否与倒转的最后两个字符相同来检查回文(而不是将整个内容与其倒转的自身进行比较) 或者,如果您想将最后一位简化为一行: print len([m for m in combinations(m

我有一个字符串,我需要找出长度为4的
回文子字符串(
all
4个索引
子字符串),其中索引应按升序排列(index1如果您想坚持当前算法的基本结构,有几种加速方法可以使用
组合
而不是
排列
,它们将按排序顺序返回一个iterable。这意味着您不需要检查索引是否按升序排列。其次,您可以加速bi它通过简单地检查前两个字符是否与倒转的最后两个字符相同来检查回文(而不是将整个内容与其倒转的自身进行比较)

或者,如果您想将最后一位简化为一行:

print len([m for m in combinations(mystr, 4) if m[:2] == m[:1:-1]]) 

我没有对此进行实时测试,但在我的系统上,此方法运行大约需要6.3秒(使用非常长的字符串)这比你的方法要快得多。

我可以用其他方法加快速度吗?给我一个提示,我会试试。我建议你阅读一些算法的详细分析,这些算法可能会对你有所帮助。或者你可以找到一本关于查找最长回文的算法的好教程,你可以根据自己的情况进行调整。你正在使用目前这是一个非常强力的方法,因此改进算法是你最好的选择。你可以通过m==m[:-1]进一步节省一些毫秒,从而在左手边节省一些计算量好的点@be_good_do_good。此外,如果你使用上面的一行,它将创建一个相当大的列表对象,因此如果你想节省内存,你可以使用
sum(1表示组合中的m(mystr,4),如果m==m[:-1])
from itertools import combinations
mystr = "kkkkkkzsdfsfdkjdbdsjfjsadyusagdsadnkasdmkofhduyhfbdhfnsklfsjdhbshjvncjkmkslfhisduhfsdkadkaopiuqegyegrebkjenlendelufhdysgfdjlkajuadgfyadbldjudigducbdj"
cnt = 0 
for m in combinations(mystr, 4):
    if m[:2] == m[:1:-1]: cnt += 1
print cnt
print len([m for m in combinations(mystr, 4) if m[:2] == m[:1:-1]])