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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:12:57