【Classic 150 刷题计划】 LeetCode 242. 有效的字母异位词 | C++ 哈希计数与严密防线

LeetCode 242. 有效的字母异位词

📌 题目描述

题目级别:简单

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

(若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。)

  • 示例 1:
    输入: s = "anagram", t = "nagaram"
    输出: true

💡 破题思路:词频统计 (Frequency Counting)

"字母异位词"的本质就是:两个字符串就像是用同一副积木拼出来的,只是积木的排列顺序不同 。

因此,我们根本不需要关心字符的顺序,只需要"清点积木的数量"即可。

算法步骤:

  1. 长度防线 :如果两副积木的总数都不一样 (s.size() != t.size()),那绝对不可能拼出一样的东西,直接一票否决,提前 return false。
  2. 同步清点 :定义两个 map 作为账本,同时遍历 s 和 t,将各自用到的字符和数量记录在案。
  3. 逐一对账 :因为题目限定了都是小写字母,所以直接从 'a' 循环到 'z'。依次对比两个账本中该字母的数量,只要发现有任何一个字母数量对不上,立刻判定为伪异位词。
  4. 通关 :如果 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;
    }
};
相关推荐
WL学习笔记6 小时前
日期类(C++)
开发语言·c++·日期类实现
H.莓飛7 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
一只小小的芙厨7 小时前
【线性DP】
学习·算法·动态规划
奋发向前wcx7 小时前
CSP-J复赛模拟赛5 王晨旭补题 2026.10.5
算法
汉克老师8 小时前
GESP2026年9月认证C++八级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
罗湖老棍子9 小时前
C Looooops(信息学奥赛一本通- P1640)
算法·数论·同余·裴蜀定理·扩展欧几里得
郝学胜_神的一滴9 小时前
C++ Templates 06:搞懂模板代码的三种组织方式
c++·visual studio
C++ 老炮儿的技术栈9 小时前
sizeof操作符
c语言·c++·人工智能·mfc·c
沫璃染墨10 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
wuminyu10 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++