以下是比赛(已结束)中与问题相关的链接:https://justpaste.it/7g5bz
我尝试过这种方法。
p = []
n = int(input())
s = input()
q = int(input())
for _ in range(q):
p.append(int(input()))
for pth in p:
print(s.count(s[pth-1],0,pth-1))
测试用例运行良好,但是当我提交此解决方案时。它显示了超过时间限制。 还有其他更优化的方法吗?
答案 0 :(得分:1)
由于您正在循环调用count()
而超时:
我首先要对输入字符串进行预处理:创建一个新列表,其中包含该字符串中字符出现的次数。这样,查询某个索引处的字符出现次数将变为O(1):
s = 'abacsddaa'
from itertools import count
from collections import defaultdict
d = defaultdict(count)
new_s = [next(d[ch]) for ch in s] # new_s is [0, 0, 1, 0, 0, 0, 1, 2, 3]
count_occurences = lambda idx: new_s[idx-1]
print(count_occurences(9))
print(count_occurences(3))
打印:
3
1