Python 3.x 如何使下面的python程序对大输入更有效地使用内存

Python 3.x 如何使下面的python程序对大输入更有效地使用内存,python-3.x,memory-management,space-complexity,memory-efficient,Python 3.x,Memory Management,Space Complexity,Memory Efficient,这个程序是为了找到至少有i个不同字母的子字符串的数量,其中1我猜是超过了内存限制,因为所有子字符串都存储在一个变量中。您可以定义一个循环,只预先计算代码中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]) al

这个程序是为了找到至少有i个不同字母的子字符串的数量,其中1我猜是超过了内存限制,因为所有
子字符串都存储在一个变量中。您可以定义一个循环,只预先计算代码中
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,0,-1):
        s += all_N[i]
        result.append(s)
    return reversed(result)

但是这个代码片段没有输出正确的答案。我需要对子字符串进行解析,以确定它是否至少包含I个不同的字符。保存长度没有达到正确的目的。请在声称代码无效之前在计算机中测试代码。建议的算法输出与您的解决方案相同的结果。数组
all\U
(以前称为
all\U L
)仅跟踪每个子字符串中找到的唯一字符数。当使用原始代码进行测试时,您在
10 6 1 0 0…
中提到的测试用例实际上会产生
10 5 2 0 0…
,这可能是造成混淆的原因。干杯,如果您需要其他测试用例的帮助,请在将建议的解决方案标记为已接受答案之前通知我。抱歉造成混淆。它工作得非常好。这是我的错。谢谢你的解决方案。没问题,谢谢你的投票。我用第二种算法更新了答案,我意识到这种算法的内存效率更高。我希望你觉得有趣:)
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,0,-1):
        s += all_N[i]
        result.append(s)
    return reversed(result)