最快方法是用 std::sort 直接排序后比较,需注意字符串可修改性、大小写统一及只读输入的拷贝处理;字符频次数组法 o(n) 更高效,适用于限定字符集场景。

用 std::sort 最快写对,但要注意字符串是否可修改
直接排序后比较是最直观、不易出错的做法,适合大多数场景。前提是允许修改原字符串或能创建副本。
- 如果输入是
std::string且可修改:直接对两个字符串调用std::sort(s.begin(), s.end()),再用==比较 - 如果输入是
const char*或只读std::string_view:必须先拷贝到可排序容器,比如std::vector<char></char>或临时std::string - 注意大小写:默认
std::sort按 ASCII 值排,'A'和'a'不等价;需统一转小写(用std::tolower配合 lambda)
用字符频次数组判断,O(n) 且不依赖排序
当字符串只含英文小写字母时,开一个长度为 26 的 int 数组最高效;含大小写或 ASCII 全集时,可用 std::array<int></int> 或 std::unordered_map<char int></char>。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 遍历第一个字符串,对每个字符做
count[c]++(c是unsigned char类型,避免负索引) - 遍历第二个字符串,做
count[c]--;中途出现count[c] 可提前返回 <code>false - 最后检查整个数组是否全为 0——但更省事的是:先比长度,长度不等直接
false,省去清零或遍历数组
遇到 Unicode 字符怎么办
C++ 标准库没有内置 Unicode-aware 的字符计数或排序,std::string 默认是字节序列。若输入是 UTF-8 编码的中文、emoji 等,按字节操作会出错。
- 不要对 UTF-8 字符串直接用
std::sort或单字节频次统计 - 实际项目中建议用 ICU 库或 C++20 的
<charconv></charconv>+std::utf8_decoder(尚未普及)拆出 code point - 临时方案:若确定输入只有 ASCII 字符(含空格、标点),可先过滤非字母字符并转小写,再走频次数组法
std::is_permutation 看似简洁,但有隐藏成本
这个算法确实语义清晰:std::is_permutation(s1.begin(), s1.end(), s2.begin()),但它最坏是 O(n²),且不保证短路(即使开头就不同,也可能扫完整个范围)。
- 它内部可能用双层循环比对,不是基于频次或排序
- 不处理大小写,也不忽略空格/标点——这些都得靠预处理
- 在竞赛或性能敏感场景应避免;仅用于原型验证或数据量极小(
std::sort 和频次数组都会悄悄出错。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










