当前位置: 首页 > 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.rkmt.cn/news/1463113.html

相关文章:

  • 智能考核系统落地失败率高达67%?(2024权威调研白皮书首发:AI+HR考核整合的7个生死关卡)
  • 医药企业如何选择和使用外勤软件系统 - 数智AI前沿
  • Windows 11系统优化神器:Win11Debloat一键清理让电脑性能飙升
  • 2026年厦门救护车推荐:120急救车/医院救护车/医用救护车与工厂学校紧急救援车优选 - 品牌企业推荐师(官方)
  • 如何快速掌握ExcelJS中VmlNotesXform:从XML处理到注释渲染的完整指南
  • 从弛张振荡器到恒流驱动:手把手打造3W LED螺旋氛围灯
  • 如何用WanVideo_comfy实现文本转视频?T2V功能快速上手教程
  • 2026年 环保设备厂家/厂家推荐榜:覆盖重庆家具厂、福建木作厂、贵州工业净化/除尘/废气/喷淋净化/固废处理等环保设备源头工厂与一体化节能设备优选! - 品牌企业推荐师(官方)
  • 旧滑板改造LED台灯:从电路原理到创意制作的完整指南
  • AI工具与智能上市整合:为什么92%的Pre-IPO企业还在用Excel做底稿?3步切换合规智能工作流
  • 决定 GPU 显存命运的那行 C++ 代码:写时复制(CoW)如何拯救大模型推理吞吐?
  • TimeMoE-200M安全与稳定性:确保时间序列预测可靠性的最佳实践
  • GPT-5.5 vs GPT-4o:深度评测新一代语言模型的逻辑推理极限
  • ExcelJS中VML锚点处理:深入解析VmlAnchorXform的核心功能
  • 基于树莓派4与RAID 1搭建高可用Nextcloud私有云全攻略
  • 高效管理Obsidian图片:永久保存网络资源的终极方案
  • 如何5分钟搞定网易云插件安装:BetterNCM-Installer终极指南
  • RapidOCR异构计算架构:实现10倍性能提升的实时文字识别技术突破
  • Multi-Agent协同机制:如何让智能体团队高效配合完成复杂任务
  • 实战指南:5步掌握RISC-V可视化处理器模拟器
  • 衍射级次偏振态的研究
  • AI驱动的资金调度革命:3步实现转账自动化、风控实时化与审计可追溯化(附银行级API调用清单)
  • OpenClaw + Kubernetes 运维:自动化配置生成,赋能高效应用管理
  • 城市共享单车管理原型设计
  • 小红书爆款攻略:搜索转化与精准投放
  • 为什么选择MoviePy:Python视频编辑的完整指南
  • 微信聊天记录永久保存:简单三步打造你的数字记忆保险箱
  • 2026年6月密集架厂家推荐排行:智能密集架、档案密集架、手动密集架、移动密集架、钢制密集架品牌深度解析 - 企业推荐官【官方】
  • Processing与Arduino串口通信:实现鼠标实时控制双舵机系统
  • 【笔记】卡特兰数