我在hackerrank.com上看到了这个问题,问题是从给定的字符串中找到一个4字母的回文,也可以是一个长字符串。 约束如下:
其中,| 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.
它仍然比我之前使用的技术更好,但我无法做到比这更好。
建议吗?
答案 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))