LeetCode 242. 有效的字母异位词
📌 题目描述
题目级别:简单
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
(若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。)
- 示例 1:
输入:s = "anagram",t = "nagaram"
输出:true
💡 破题思路:词频统计 (Frequency Counting)
"字母异位词"的本质就是:两个字符串就像是用同一副积木拼出来的,只是积木的排列顺序不同 。
因此,我们根本不需要关心字符的顺序,只需要"清点积木的数量"即可。
算法步骤:
- 长度防线 :如果两副积木的总数都不一样 (
s.size() != t.size()),那绝对不可能拼出一样的东西,直接一票否决,提前return false。 - 同步清点 :定义两个
map作为账本,同时遍历s和t,将各自用到的字符和数量记录在案。 - 逐一对账 :因为题目限定了都是小写字母,所以直接从
'a'循环到'z'。依次对比两个账本中该字母的数量,只要发现有任何一个字母数量对不上,立刻判定为伪异位词。 - 通关 :如果 26 个字母的账全部对齐,说明完全合法,返回
true。
💻 C++ 代码实现 (原汁原味作者版)
cpp
class Solution {
public:
bool isAnagram(string s, string t) {
// 防御性编程:长度不同绝对不可能是字母异位词,直接剪枝
if (s.size() != t.size()) return false;
// 使用两个 map 分别记录 s 和 t 的字符频次
map<char, int> mp, pm;
// 同步遍历,一趟循环完成两个字符串的清点
for (int i = 0; i < s.size(); i ++ )
{
mp[s[i]] ++ ;
pm[t[i]] ++ ;
}
// 针对小写字母集进行地毯式对账
for (char i = 'a'; i <= 'z'; i ++ )
{
// 只要有一个字符的频次出现分歧,判定失败
if (mp[i] != pm[i]) return false;
}
return true;
}
};