用std::array统计26个小写字母频次最稳,核心是字符种类和数量完全相同;对纯英文小写字母场景,它比哈希表更快、更确定,无冲突、无分配、缓存友好。

用 std::array 统计 26 个小写字母频次最稳
直接判断两个字符串是否为字母异位词,核心是「字符种类和数量完全相同」。对纯英文小写字母(a-z)场景,std::array<int></int> 比 std::map 或 std::unordered_map 更快、更确定——无哈希冲突、无内存分配、缓存友好。
实操建议:
- 先检查长度,不等直接返回
false - 遍历第一个字符串,用
s[i] - 'a'算下标,累加计数 - 遍历第二个字符串,同样算下标,逐个减一;任一位置变负,可提前返回
false - 最后无需再扫一遍数组——只要没提前退出,就说明完全匹配
遇到大小写混合或非字母字符怎么办
标准字母异位词定义通常**区分大小写且只考虑字母**,但实际业务中常需统一处理。别急着用 std::tolower 全转小写再统计,容易踩坑:
-
std::tolower对char传参时,若值为负(如某些平台char默认有符号),会触发未定义行为 - 非 ASCII 字符(如中文、emoji)调用
std::tolower可能返回原值或异常值,破坏计数逻辑
稳妥做法:先过滤或预判字符范围。例如只处理 a-z 和 A-Z,统一转小写时显式转换为 unsigned char:
立即学习“C++免费学习笔记(深入)”;
int idx = std::tolower(static_cast<unsigned char>(c)) - 'a';
若需支持 Unicode 字母,就得换方案——比如用 ICU 库或改用 std::unordered_map<char32_t int></char32_t>,但性能代价明显上升。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
std::sort 排序法看似简单,但线上慎用
把两字符串分别排序再比较,代码确实短:
std::string s1_sorted = s1; std::sort(s1_sorted.begin(), s1_sorted.end());<br>std::string s2_sorted = s2; std::sort(s2_sorted.begin(), s2_sorted.end());<br>return s1_sorted == s2_sorted;
但它在实战中有硬伤:
- 时间复杂度升到
O(n log n),而计数法是稳定O(n) - 额外开两倍空间(拷贝 + 排序内部缓冲),对长字符串或高频调用易引发内存压力
- 若字符串含 \0 或嵌入空字符,
std::string虽能存,但std::sort不会出错,结果却可能不符合语义预期
LeetCode 测试用例跑过 ≠ 生产环境安全
很多题解靠 vector<int>(26)</int> 过了 "anagram" 和 "nagaram" 就收工,但真实数据可能含空格、标点、数字甚至控制字符。一旦输入含 'A' 却没做大小写归一,或含 '9' 却仍用 - 'a' 算下标,就会越界访问——轻则结果错,重则崩溃。
上线前务必确认:
- 输入约束文档是否明确限定字符集?
- 函数接口要不要自己做输入校验?比如发现非字母字符立即返回
false或抛异常 - 是否要兼容 locale?比如德语
ä是否视作a的变体?这已超出基础计数法能力
计数法本身很干净,但边界怎么划,得看需求,不是代码写完就自动成立的。

















