C++代码随想录刷题知识分享-----判断两个字符串是否为字母异位词(Anagram)【LeetCode 242】
✨ 题目描述
给定两个字符串 s
和 t
,请判断 t
是否是 s
的字母异位词。
📌 示例 1:
输入:s = "anagram", t = "nagaram"
输出:true
📌 示例 2:
输入:s = "rat", t = "car"
输出:false
✅ 限制条件:
- 1 <= s.length, t.length <= 5 * 10⁴
s
和t
仅包含小写字母
🧠 解题思路
✅ 字母异位词的定义:
两个字符串是字母异位词,当且仅当:
- 它们长度相同;
- 每个字符出现的次数完全一致。
我们可以通过哈希表统计字符频率来判断两字符串是否是异位词。
🚀 解法一:使用固定大小数组哈希(只适用于小写英文字母)
🎯 思路:
- 使用一个大小为 26 的整型数组
hash[26]
; - 对字符串
s
中的每个字符计数+1
; - 对字符串
t
中的每个字符计数-1
; - 最终如果
hash
中所有元素都为0
,说明是异位词。
✅ C++ 代码(含详细注释):
class Solution {
public:bool isAnagram(string s, string t) {// 长度不同,直接不是异位词if (s.length() != t.length()) return false;int hash[26] = {0}; // 小写字母 a~z 对应下标 0~25// 统计 s 中字符频率for (char ch : s) {hash[ch - 'a']++;}// 抵消 t 中字符频率for (char ch : t) {hash[ch - 'a']--;}// 检查是否所有字符频率归零for (int i = 0; i < 26; ++i) {if (hash[i] != 0) return false;}return true;}
};
或者:
class Solution {
public:bool isAnagram(string s, string t) {int hash[26]={0};for (int i=0;i<s.size();i++){hash[s[i]-'a']++;}for(int i=0;i<t.size();i++){hash[t[i]-'a']--;}for (int i=0;i<26;i++){if(hash[i]!=0){return false;}}return true;}
};
💬 解法二(进阶):支持 Unicode 字符(使用 unordered_map
)
如果字符串中可能包含 Unicode 字符或大小写字母混合,就不能使用固定大小数组了。
✅ 改进思路:
- 使用
unordered_map<char, int>
替代数组; - 同样对
s
加一、对t
减一; - 最后检查 map 中所有值是否为 0。
🔍 C++ 代码:
class Solution {
public:bool isAnagram(string s, string t) {if (s.size() != t.size()) return false;unordered_map<char, int> count;for (char ch : s) count[ch]++;for (char ch : t) count[ch]--;for (auto& [key, val] : count) {if (val != 0) return false;}return true;}
};
⏱️ 复杂度分析
解法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
数组哈希 | O(n) | O(1)(固定 26 个字符) | 小写字母 a~z |
unordered_map | O(n) | O(k)(字符种类) | 任意字符、支持 Unicode |
🧩 面试延伸问题
- ✅ 如果要区分大小写,只需保留字符原值,不转成小写。
- ✅ 如果字符是 Unicode,建议用
unordered_map<wchar_t, int>
或unordered_map<char32_t, int>
。 - ✅ 能不能用排序?可以,排序后直接比较两个字符串是否相等,但时间复杂度是
O(n log n)
,略低效。
🧠 总结
- 本题的核心是:统计字符频率,并判断是否一致。
- 面试中建议优先使用 O(n) 的哈希法,数组适合小写字母,map 支持通用情况。
- 本题可作为许多字符串处理题的基础(如最小覆盖子串、异位词分组等)。
🔚 附:常见技巧回顾
技巧 | 说明 |
---|---|
ch - 'a' | 快速将 'a'~'z' 映射到数组下标 0~25 |
unordered_map<char, int> | 用于统计任意字符的频率 |
std::all_of (C++17) | 判断数组是否全为某值 |
如果你觉得这篇博客有帮助,欢迎点赞收藏!如有问题或建议,也欢迎评论交流 😊
如果你还想了解类似题型,比如回文判断、最短覆盖子串、异位词分组,欢迎关注后续内容~ 🚀