LeetCode最长回文串代码内存占用14MB 求分析原因
分析LeetCode最长回文串解法内存占用过高的问题
嘿,我来帮你拆解下这段代码内存占用偏高的原因,以及可以优化的方向~
首先你的代码逻辑是没问题的——统计字符频率,计算最多能组成的回文串长度,但内存表现差主要出在数据结构的选择上:
1. 手动构建字典的额外开销
你用的all_freq = {}这种手动构建的字典,在Python里有不小的内存开销。字典底层是哈希表,除了存储键值对本身,还需要维护哈希冲突的解决结构、预留扩容空间、以及每个键值对的元数据(比如哈希值、对象引用)。哪怕你只统计几十个字符,字典的基础内存占用也比更轻量化的结构高很多。
2. 更省内存的替代方案
针对字符统计的场景,我们有更高效的选择:
- 固定大小数组:因为题目中的字符基本都是ASCII范围内的(就算是Unicode常用字符,范围也有限),用一个固定长度的数组来统计频率,内存占用是固定且极小的。数组是连续内存块,没有字典的额外开销,比如用
[0] * 128就能覆盖所有ASCII字符。 collections.Counter:虽然它也是基于字典实现,但内部做了优化,内存效率会比手动构建的字典略好一点(不过提升幅度不如数组明显)。
优化后的示例代码
改成数组统计的版本,内存占用会大幅降低:
class Solution: def longestPalindrome(self, s: str) -> int: # 用数组存储ASCII字符的频率 freq = [0] * 128 for c in s: freq[ord(c)] += 1 total = 0 has_odd_freq = False for count in freq: total += count // 2 if count % 2 == 1: has_odd_freq = True total *= 2 if has_odd_freq: total += 1 return total
额外说明
另外提一句,LeetCode的内存统计偶尔会有波动,比如测试时的服务器负载、Python解释器版本差异(比如CPython和PyPy的内存表现差很多),但你的代码处于后10%,核心原因还是字典的额外内存开销。
你的逻辑完全正确,只是换个更合适的数据结构就能大幅优化内存表现啦~
内容的提问来源于stack exchange,提问作者Karol
相关产品推荐
相关产品推荐

