【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;
    }
};
相关推荐
一去不复返的通信er4 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
青瓦梦滋5 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
程序 代码狂人7 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade8 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
Xin7709 小时前
LeetCode 79. 单词搜索(DFS 回溯法)
leetcode
小郎君65810 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
CodeYp201910 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
邵奈一10 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS10010 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法