You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python程序触发MemoryError:长字符串生成4唯一字母permutations求助

问题描述

从输入字符串中选取4个唯一字母的组合,生成所有可能的排列,结果需无重复元素。但当输入字符串长度超过23时,运行代码会触发MemoryError。原代码如下:

word = input()
answer = []
st_arr = []
for j in range(len(word) - 1, -1, -1):
    for k in range(len(st_arr)):
        # mid = word[j] + st_arr[k]
        # if len(mid) == 4:
        st_arr.append(word[j] + st_arr[k])
    st_arr.append(word[j])
for j in st_arr:
    if len(j) == 4:
        final_list = [[]]
        length = len(j)
        groups = [list(j)] * length
        for i in groups:
            final_list = [x+[y] for x in final_list for y in i]
        permutations = [''.join(item) for item in final_list]
        for i in permutations:
            x = list(set(i))
            y = list(i)
            x.sort()
            y.sort()
            if x == y:
                answer.append(i)
问题根源
  1. 无效元素过载:原代码生成了所有长度1到4的子串(含重复字母的),再从中筛选目标结果,导致st_arr在输入较长时爆炸式增长——比如长度23的字符串,生成的子串总数达2^23-1,完全冗余。
  2. 排列生成低效:手动生成排列的方式会产生大量重复结果,后续通过set去重进一步浪费内存与计算资源。
  3. 内存累积严重:所有中间结果和最终结果都存入列表,未按需生成或即时处理,导致内存占用超标。
优化方案

直接使用Python标准库itertools模块,它提供了高效的组合、排列生成工具,精准控制逻辑,避免不必要的内存消耗:

import itertools

word = input()
# 先对输入字符串去重,避免生成重复组合
unique_chars = list(set(word))
# 生成所有4个不同字母的组合
combinations = itertools.combinations(unique_chars, 4)
# 对每个组合生成所有排列,用集合自动去重
result = set()
for combo in combinations:
    perms = itertools.permutations(combo)
    result.update(''.join(p) for p in perms)
# 按需求转换为有序列表(可选,根据题目输出要求调整)
answer = sorted(result)
# 输出结果
for item in answer:
    print(item)
优化点说明
  • 精准生成组合:itertools.combinations直接从去重后的字符中生成4个唯一字母的组合,跳过所有无效短子串与重复字母组合,从根源减少数据量。
  • 高效生成排列:itertools.permutations针对有效组合生成排列,不会产生冗余重复(因组合本身已确保字母唯一)。
  • 内存友好:itertools采用生成器模式,不会一次性加载所有结果到内存;用集合存储结果自动去重,进一步降低内存占用。
  • 去重前置:先对输入字符串去重,减少后续组合与排列的处理量。

内容的提问来源于stack exchange,提问作者Salman Adnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:45:36