以下代码的有效方式

时间:2017-08-09 17:52:33

标签: python-2.7 performance

我在hackerrank.com上看到了这个问题,问题是从给定的字符串中找到一个4字母的回文,也可以是一个长字符串。 约束如下:

enter image description here

其中,| s |是字符串的长度,a,b,c,d是回文中相应字母的位置。 我找到了解决方案,但效率不高,因为在处理时间内它会给出“超时”错误。代码如下:

s='kkkkkkz'
n=0
c_i,c_j,c_k,c_l=0,0,0,0
for i in range(len(s)): 
    j=0;c_i+=1
    while j>=0 and j<len(s):    
        c_j+=1
        if j>i: 
            k=0
            while k>=0 and k<len(s):    
                c_k+=1
                if k>j: 
                    l=0
                    while l>=0 and l<len(s):    
                        c_l+=1
                        if l>k: 
                            a=s[i]+s[j]+s[k]+s[l]
                            if a[0]==a[3] and a[1]==a[2]: n+=1
                        l+=1
                k+=1
        j+=1
print n

我想到了每个循环运行的次数,现在是7,49,147和245.

它仍然比我之前使用的技术更好,但我无法做到比这更好。

建议吗?

1 个答案:

答案 0 :(得分:1)

一种方法是使用以下方法,但这仍然不够有效。分数12/40 ..

import itertools

s=WHATEVERSTRING
n=0
for a in itertools.combinations(s, 4):
    n += (a[0] == a[3])*(a[1]==a[2])
print(n)

一个有效的解决方案是沿着以下路线:在字符串中创建一组唯一字符,并将子字符串对映射到字典。然后计算成对对的所有出现次数。

from collections import defaultdict as di

data = [x for x in s.strip()]
chars = set(data)

sum_a = 0
for c in chars:
    a = 0
    b = di(int)
    double_pairs = 0
    for d in data:
        if d == c:
            sum_a += double_pairs
            double_pairs += b[c]
            b[c]+=a
            a += 1

        else:
            double_pairs += b[d]
            b[d] += a
print(sum_a%(10**9+7))