从Python中的排列中寻找Palidrome

时间:2016-07-23 21:40:45

标签: python algorithm permutation palindrome

我有一个字符串,我需要找出palindromic sub-string of length 4all 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

1 个答案:

答案 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秒(使用非常长的字符串),这比您的方法快得多。