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到4的子串(含重复字母的),再从中筛选目标结果,导致
st_arr在输入较长时爆炸式增长——比如长度23的字符串,生成的子串总数达2^23-1,完全冗余。 - 排列生成低效:手动生成排列的方式会产生大量重复结果,后续通过
set去重进一步浪费内存与计算资源。 - 内存累积严重:所有中间结果和最终结果都存入列表,未按需生成或即时处理,导致内存占用超标。
优化方案
直接使用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
相关产品推荐
相关产品推荐

