如何解决如何使下面的python程序对于大输入更有效地使用内存
这个程序是要找出长度为 N 的字符串 S 中至少有 i 个不同字母的子串的个数,其中 1
def distinctChars (N,S):
# Write your code here
substrings = " ".join((S[i:j] for i in range(N) for j in range(i+1,N+1)))
for i in range(1,27):
if i==1:
yield len(substrings.split(" "))
else:
yield len([item for item in substrings.split(" ") if len(set(item)) >= i])
N = int(input())
S = input()
out_ = distinctChars(N,S)
print (' '.join(map(str,out_)))
示例输入
N=4
A=aabc
10 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
代码根据需要快速并且输出正确。但是不管怎么试,都超过了分配的250MB内存。
解决方法
我猜超出了内存限制,因为所有 substrings
都存储在一个变量中。您可以改为定义一个循环来仅预先计算代码中 len(set(item))
的值:
def DistinctChars (N,S):
all_U = []
for i in range(N):
D = set()
for j in range(i,N):
D.add(S[j])
all_U.append(len(D))
for i in range(1,27):
yield sum( 1 for n in all_U if n>=i)
这种方法可以成倍地节省资源,因为所有子字符串都只被它们的唯一字符数替换。
附注。实际上可以构建一个更有效的算法,即立即计算具有给定数量的唯一字符的子字符串的数量。然后,最终答案对应于具有相同或更多唯一字符数的条目的累积总和:
def DistinctChars (N,S):
all_N = [0]*27
for i in range(N):
D = set()
for j in range(i,N):
D.add(S[j])
all_N[len(D)] += 1
result = []
s = 0
for i in range(26,-1):
s += all_N[i]
result.append(s)
return reversed(result)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。