我有一个字符串,我需要找出palindromic sub-string of length 4
(all
4 indexes
个子字符串),其中索引应该在ascending order (index1<index2<index3<index4)
中。
我的代码适用于像mystr
这样的小字符串。但是当谈到大字符串时需要很长时间。
from itertools import permutations
#Mystr
mystr = "kkkkkkz" #"ghhggh"
#Another Mystr
#mystr = "kkkkkkzsdfsfdkjdbdsjfjsadyusagdsadnkasdmkofhduyhfbdhfnsklfsjdhbshjvncjkmkslfhisduhfsdkadkaopiuqegyegrebkjenlendelufhdysgfdjlkajuadgfyadbldjudigducbdj"
l = len(mystr)
mylist = permutations(range(l), 4)
cnt = 0
for i in filter(lambda i: i[0] < i[1] < i[2] < i[3] and (mystr[i[0]] + mystr[i[1]] + mystr[i[2]] + mystr[i[3]] == mystr[i[3]] + mystr[i[2]] + mystr[i[1]] + mystr[i[0]]), mylist):
#print(i)
cnt += 1
print(cnt) # Number of palindromes found
答案 0 :(得分:1)
如果你想坚持当前算法的基本结构,加速它的几种方法是使用combinations
而不是permutations
,它将按排序顺序返回一个iterable 。这意味着您无需检查索引是否按升序排列。其次,您可以通过简单地检查前两个字符是否与最后两个字符相反(而不是将整个事物与其反转的自身进行比较)来加快检查回文的位。
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]])
我没有对此进行实时测试,但在我的系统中,此方法运行大约需要6.3秒(使用非常长的字符串),这比您的方法快得多。