当前位置: 首页 > ds >正文

C++代码随想录刷题知识分享-----判断两个字符串是否为字母异位词(Anagram)【LeetCode 242】

✨ 题目描述

给定两个字符串 st,请判断 t 是否是 s 的字母异位词。

📌 示例 1:

输入:s = "anagram", t = "nagaram"
输出:true

📌 示例 2:

输入:s = "rat", t = "car"
输出:false

✅ 限制条件:

  • 1 <= s.length, t.length <= 5 * 10⁴
  • st 仅包含小写字母

🧠 解题思路

✅ 字母异位词的定义:

两个字符串是字母异位词,当且仅当:

  • 它们长度相同;
  • 每个字符出现的次数完全一致。

我们可以通过哈希表统计字符频率来判断两字符串是否是异位词。


🚀 解法一:使用固定大小数组哈希(只适用于小写英文字母)

🎯 思路:

  • 使用一个大小为 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_mapO(n)O(k)(字符种类)任意字符、支持 Unicode

🧩 面试延伸问题

  1. ✅ 如果要区分大小写,只需保留字符原值,不转成小写。
  2. ✅ 如果字符是 Unicode,建议用 unordered_map<wchar_t, int>unordered_map<char32_t, int>
  3. ✅ 能不能用排序?可以,排序后直接比较两个字符串是否相等,但时间复杂度是 O(n log n),略低效。

🧠 总结

  • 本题的核心是:统计字符频率,并判断是否一致
  • 面试中建议优先使用 O(n) 的哈希法,数组适合小写字母,map 支持通用情况
  • 本题可作为许多字符串处理题的基础(如最小覆盖子串、异位词分组等)。

🔚 附:常见技巧回顾

技巧说明
ch - 'a'快速将 'a'~'z' 映射到数组下标 0~25
unordered_map<char, int>用于统计任意字符的频率
std::all_of(C++17)判断数组是否全为某值

如果你觉得这篇博客有帮助,欢迎点赞收藏!如有问题或建议,也欢迎评论交流 😊
如果你还想了解类似题型,比如回文判断、最短覆盖子串、异位词分组,欢迎关注后续内容~ 🚀

http://www.xdnf.cn/news/4614.html

相关文章:

  • 【论文阅读】Reconstructive Neuron Pruning for Backdoor Defense
  • C++类对象的隐式类型转换和编译器返回值优化
  • idea左侧项目资源管理器不见了处理
  • Python+深度学习:如何精准评估食品过敏风险?
  • 代码随想录Day20
  • Canal mysql to mysql 增加 online 库同步配置指南
  • MATLAB技巧——命令行输入的绘图,中文是正常的,到了脚本(m文件)里面就变成乱码的解决方法
  • 普通笔记本与军用加固笔记本电脑的区别,探索防水、防爆、防摔的真·移动工作站!
  • 2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)
  • java ReentrantLock
  • MySQL的基本操作
  • 《Python星球日记》 第46天:决策树与随机森林
  • 二分查找习题
  • SQL 中的中括号 [ ]、双引号 “ “、反引号 ` `:SQL Server、Oracle、MySQL三大数据库标识符 定界符 详解
  • Xilinx XCKU11P-2FFVA1156I 赛灵思 FPGA AMD Kintex UltraScale+
  • K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析
  • Python案例实战《鲜花识别模型训练及调用》
  • 使用 Selenium 截图功能,截不到原生 JavaScript 弹窗
  • 【视觉基础模型-SAM系列-2】SAM2: Segment Anything in Images and Videos
  • 【上位机——MFC】对象和控件绑定
  • kettle从入门到精通 第九十六课 ETL之kettle Elasticsearch 增删改查彻底掌握
  • C++GO语言socket套接字
  • Go语言——for循环、包构建以及包冲突
  • 怎样避免住宅IP被平台识别
  • Prompt Engineering 提示词工程学习
  • 【iscsi】服务器重启找不到iscsi的磁盘,导致磁盘挂载失败
  • uniapp 震动功能实现
  • 约瑟夫josephu问题
  • 企业数字化转型第二课:接受不完美(1/2)
  • MCP相关标的梳理