当前位置: 首页 > news >正文

力扣刷题#5:LeetCode242字母异位词_从 7ms 到 0ms 就差一个数组

力扣刷题#5:有效的字母异位词_从 7ms 到 0ms 就差一个数组

哈希表好用,但不是万能的。有时候,一个 26 长度的数组比什么 STL 都管用。


题目

给定两个字符串 s 和 t,判断它们是否是字母异位词(每个字母出现次数相同)。

输入: s = "anagram", t = "nagaram"  → true
输入: s = "rat", t = "car"         → false

第一版:杀鸡用牛刀

我的思路很清晰:遍历 s 记次数,遍历 t 减次数,减到负数就返回 false。

unordered_map<char, int> smap;
for (int i = 0; i < slen; i++) smap[s[i]]++;
for (int i = 0; i < tlen; i++) {smap[t[i]]--;if (smap[t[i]] < 0) return false;
}

逻辑没问题,通过了。但耗时 7ms

看了一下题解区,有人 0ms。凭什么?同样的逻辑,差距这么大?


提示:只用小写字母

"题目说了只包含小写字母,你开个 26 的数组就行了。"

就这一句话,我就知道差距在哪了。

unordered_map<char, int>   → 哈希计算 + 动态分配 + 内存开销
int count[26]              → 栈上固定空间,取址就完事

一个是要算哈希、要扩容、要处理冲突;另一个就是 base_address + index * 4 一条指令。


第二版:数组版

int smap[200] = {0};
for (int i = 0; i < slen; i++) smap[0 + int(s[i])]++;
for (int i = 0; i < tlen; i++) {smap[0 + int(t[i])]--;if (smap[0 + int(t[i])] < 0) return false;
}

改成数组后,时间直接掉到接近 0ms。虽然用了 200 而不是 26,但数组访问就是数组访问,比哈希表快太多了。


最终版:细节拉满

class Solution {
public:bool isAnagram(string s, string t) {if (s.length() != t.length()) return false;int count[26] = {0};for (char c : s) count[c - 'a']++;for (char c : t) {count[c - 'a']--;if (count[c - 'a'] < 0) return false;}return true;}
};
改动 说明
count[26] 而非 count[200] 小写字母就 26 个,精确分配
c - 'a' 而非 int(s[i]) 'a'→0,'b'→1……语义自解释
for (char c : s) 范围 for 更简洁,不用管下标

学到了什么

数据结构的选择比代码逻辑更重要。

同样的算法(遍历 → 记数 → 减数 → 判断),用哈希表 7ms,用数组 ≈0ms。不是哈希表不好,而是当数据范围已知且很小时,数组永远是最高效的选择

场景 用什么 原因
字母异位词(26 种) int[26] 范围固定,直接寻址
存在重复元素(值域未知) unordered_set 范围未知,哈希表灵活
两数之和(需要配对) unordered_map 需要存键值对
大数据量模糊查找 哈希表 伸缩性好

栈上开数组 ≈ 一条指令,哈希表 ≈ 几十条指令。 当你知道数据范围不超过 26,就别用哈希表。


写于 2026-06-04。熟悉了哈希表后,要知道什么时候不用它——这才叫真正学会了。

http://www.jsqmd.com/news/951496/

相关文章:

  • 3分钟掌握ComfyUI ControlNet Aux:AI图像生成必备预处理工具完全指南
  • ExcelJS核心功能解析:读写XLSX文件从未如此简单
  • 终极LevelDB GUI管理工具:LevelUI实战指南
  • 医药企业如何选择和使用外勤软件系统 - 数智AI前沿
  • 智能考核系统落地失败率高达67%?(2024权威调研白皮书首发:AI+HR考核整合的7个生死关卡)
  • 【紧急预警】2024年档案AI化窗口期仅剩11个月!国家档案局新规倒逼下的3类机构迁移时间表与风险熔断机制
  • ExcelJS错误处理终极指南:7个常见问题与解决方案
  • 顺手填个配置,秒知你的电脑能跑啥AI大模型
  • 基于Arduino的智能手势交互系统:从电容触摸到蓝牙通信的完整实现
  • 2026年光模块GEO优化公司哪家好?实测五大服务商核心能力与选型指南 - GEO优化
  • AI测试入门:什么是人工智能(AI)模型?2026新手第一课
  • 转行学农机维修培训 高口碑正规培训机构选这家 - 湖南阳光技术
  • Windows 11系统优化神器:Win11Debloat一键清理让电脑性能飙升
  • RAG向量检索:智能体项目中不可或缺的知识库
  • 2026年厦门救护车推荐:120急救车/医院救护车/医用救护车与工厂学校紧急救援车优选 - 品牌企业推荐师(官方)
  • 10分钟掌握ExcelJS:Node.js电子表格处理终极指南
  • 泊松过程不只是数学:在Redis缓存失效、微服务熔断与消息队列中的实战思考
  • WarcraftHelper终极指南:5分钟彻底解决魔兽争霸3现代兼容性问题
  • 如何快速掌握ExcelJS中VmlNotesXform:从XML处理到注释渲染的完整指南
  • 从弛张振荡器到恒流驱动:手把手打造3W LED螺旋氛围灯
  • 如何用WanVideo_comfy实现文本转视频?T2V功能快速上手教程
  • Streamlit:智能体项目的轻量前端神器
  • 2026年 环保设备厂家/厂家推荐榜:覆盖重庆家具厂、福建木作厂、贵州工业净化/除尘/废气/喷淋净化/固废处理等环保设备源头工厂与一体化节能设备优选! - 品牌企业推荐师(官方)
  • GPT-5.5 nano实战指南:32K上下文与DTR机制深度解析
  • 实操题
  • AI工具与智能上市整合:为什么92%的Pre-IPO企业还在用Excel做底稿?3步切换合规智能工作流
  • 揭秘ExcelJS中的RelationshipsXform:轻松掌握Excel关系XML处理的核心技术
  • 旧滑板改造LED台灯:从电路原理到创意制作的完整指南
  • KEIL工程移植后,那个烦人的红色叉号怎么消?手把手教你修改UVCC.ini文件
  • Python基础 - 什么是模块 Python代码的组织方式