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

LeetCode 242. 有效的字母异位词

📌 题目描述

题目级别:简单

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

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

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

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

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

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

算法步骤:

  1. 长度防线 :如果两副积木的总数都不一样 (s.size() != t.size()),那绝对不可能拼出一样的东西,直接一票否决,提前 return false
  2. 同步清点 :定义两个 map 作为账本,同时遍历 st,将各自用到的字符和数量记录在案。
  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;
    }
};
相关推荐
wabs6661 小时前
关于二叉树【力扣101.对称二叉树的思考】
数据结构·c++·算法·leetcode·二叉树
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 双游标区间扫描与 to_string 规范
c++·算法·leetcode
玖玥拾2 小时前
LeetCode 383 赎金信
算法·leetcode
维克兜率天2 小时前
5.3 宏观因子:抬头看天
笔记·python·深度学习·算法·量化
LuminousCPP2 小时前
数据结构-排序(五):计数排序与排序专题阶段总结|从外部归并到线性排序,再看算法边界与选型
c语言·数据结构·笔记·算法·排序算法
流云枫2 小时前
003-上下文窗口:物理限制、KV Cache 与工程应对策略
算法
纪念 2292 小时前
C++类和对象(二)
开发语言·c++
盟道科技2 小时前
小程序订阅消息大规模投递实践:频控令牌池、Redis限流与失败补偿设计
分布式·算法·小程序
工具派2 小时前
视频场景检测是怎么找到切镜头位置的?三种思路与实测
算法·计算机视觉·视频