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

有效的字母异位词 - 题目笔记

📋题目信息

  • 题目名称:有效的字母异位词
  • 难度等级:简单
  • 题目编号:242
  • 相关标签:哈希表、字符串、排序

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

示例

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

💡核心解题思路

方法一:哈希表计数法(推荐)
使用频次数组统计字符出现次数,通过增减操作判断是否相等。

关键点

  • 固定大小数组统计字符频率
  • 统计s中字符,减去t中字符
  • 检查最终计数是否全为零

方法二:Timsort排序法
如果两个字符串是异位词,排序后的结果一定相同。

关键点

  • 利用sorted()函数排序
  • 比较排序后的结果
  • 代码简洁但复杂度较高

🔧完整代码实现

方法一:哈希表计数法

class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s) != len(t): return False array = [0] * 26 # 统计s中字符频率 for i in range(len(s)): array[ord(s[i]) - ord('a')] += 1 # 减去t中字符频率 for j in range(len(t)): array[ord(t[j]) - ord('a')] -= 1 # 检查是否全为零 for k in range(26): if array[k] != 0: return False return True

优化版本(提前终止)

class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s) != len(t): return False table = [0] * 26 for char in s: table[ord(char) - ord('a')] += 1 for char in t: table[ord(char) - ord('a')] -= 1 if table[ord(char) - ord('a')] < 0: return False return True

方法二:Timsort排序法

class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s) != len(t): return False return sorted(s) == sorted(t)

方法三:Counter函数法

from collections import Counter class Solution: def isAnagram(self, s: str, t: str) -> bool: return Counter(s) == Counter(t)

📊复杂度分析

方法时间复杂度空间复杂度说明
哈希表计数法O(n)O(1)最优解法
Counter函数法O(n)O(k)k为不同字符数
Timsort排序法O(n log n)O(n)代码简洁

🛠️核心函数详解

1. len() 函数

len(s) # 获取字符串长度
  • 作用:返回对象的长度(字符数)
  • 应用:长度预检查,快速排除不匹配情况
  • 时间复杂度:O(1)

2. ord() 函数

ord('a') # 返回97 ord('b') # 返回98
  • 作用:将字符转换为对应的ASCII码(整数)
  • 应用:字符到数组索引的映射
  • 关键技巧ord(char) - ord('a')将’a’-'z’映射到0-25
  • 时间复杂度:O(1)

3. sorted() 函数

sorted("anagram") # 返回 ['a', 'a', 'a', 'g', 'm', 'n', 'r']
  • 作用:对可迭代对象进行排序,返回新的排序后的列表
  • 内部实现:Timsort算法
  • 应用:排序后比较字符串是否相等
  • 时间复杂度:平均O(n log n),最优O(n)

4. Counter 类

from collections import Counter Counter(s) # 返回字符频率字典
  • 作用:统计可迭代对象中元素的出现次数
  • 应用:直接比较两个字符串的字符频率
  • 时间复杂度:O(n)
  • 空间复杂度:O(k)

📝代码执行流程

以 s = “anagram”, t = “nagaram” 为例(哈希表法)

初始状态

array = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

统计s中字符

'a' → array[0] += 1 → array[0] = 1 'n' → array[13] += 1 → array[13] = 1 'a' → array[0] += 1 → array[0] = 2 'g' → array[6] += 1 → array[6] = 1 'r' → array[17] += 1 → array[17] = 1 'a' → array[0] += 1 → array[0] = 3 'm' → array[12] += 1 → array[12] = 1 # 结果:array = [3,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0]

减去t中字符

'n' → array[13] -= 1 → array[13] = 0 'a' → array[0] -= 1 → array[0] = 2 'g' → array[6] -= 1 → array[6] = 0 'a' → array[0] -= 1 → array[0] = 1 'r' → array[17] -= 1 → array[17] = 0 'a' → array[0] -= 1 → array[0] = 0 'm' → array[12] -= 1 → array[12] = 0 # 最终:array = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

检查结果:所有元素都为0,返回True

🎯解题关键点

核心思路

  • 计数数组:固定大小数组统计字符频率
  • 统计抵消:s中加,t中减,最终检查是否归零
  • 提前终止:发现负数立即返回false
  • 长度预检:快速排除明显不匹配情况

算法优势

  • 时间高效:线性时间复杂度O(n)
  • 空间节省:固定空间复杂度O(1)
  • 逻辑清晰:三步走:统计→抵消→验证
  • 实用性强:适合生产环境应用

🔍边界情况处理

  • ✅ 两个字符串长度相同
  • ✅ 两个字符串长度不同
  • ✅ 其中一个字符串为空
  • ✅ 字符串包含重复字符
  • ✅ 字符串完全相同
  • ✅ 字符串完全不同

📚知识点总结

编程概念

  • 哈希表思想:使用数组实现字符计数
  • 双指针技术:遍历字符串的索引控制
  • 数组操作:索引访问和修改
  • 算法优化:提前终止机制

Python特性

  • 类型提示:s: str 参数类型声明
  • 列表初始化:[0] * 26 快速创建数组
  • ord()函数:字符到整数的转换
  • range()函数:生成索引序列

算法思想

  • 计数排序:通过计数实现排序判断
  • 空间换时间:使用固定数组换取时间效率
  • 分步处理:将复杂问题分解为简单步骤

🚀扩展思考

其他可能的解法

  • 递归方法:递归比较字符频率
  • 字典计数:使用dict代替数组
  • 位运算:针对小写字母的位图法

相关题目类型

  • 字符串匹配问题
  • 字符统计问题
  • 哈希表应用问题
  • 数组计数问题

性能优化方向

  • 提前终止机制
  • 内存访问优化
  • 循环展开优化
  • 并行处理可能

💪学习收获

通过这道题目,我学会了:

✅ 哈希表计数法的实际应用
✅ 字符到索引的映射技巧
✅ 算法复杂度的分析方法
✅ 边界条件的处理方法
✅ Python字符串和数组的高效操作
✅ 多种解法的比较和选择
✅ 代码优化的重要性和方法

📌记住:选择合适的算法不仅要考虑时间复杂度,还要考虑实际应用场景、代码可读性和维护性。哈希表计数法在性能和实用性之间达到了很好的平衡!

http://www.jsqmd.com/news/470309/

相关文章:

  • 中控IFace考勤机二开内存问题解决方案
  • 【IEEE出版、连续五届EI稳定检索、211高校主办】第六届信号图像处理与通信国际学术会议(ICSIPC 2026)
  • 使用 C++、YOLO 和 ONNX Runtime 实现实时目标检测的完整教程整理与代码实现指南。
  • Flutter 三方库 graph_kit 的鸿蒙化适配指南 - 让逻辑治理回归“拓扑之美”,打造鸿蒙应用专家级的图算法与依赖治理中台
  • 教你如何用GPT-来分析你的dump文件定位内存泄漏问题——避免无效加班必备神器
  • 高可用高并发微服务架构设计:Nginx 与 API Gateway 的协同实践
  • Xsvn:鸿蒙系统首款SVN客户端
  • ImageToTensor函数的完整实现版本,專門用在 .NET MAUI + YOLOv8 ONNX 推理流程中
  • 基于51单片机手机无线蓝牙APP遥控智能车系统论文
  • DeepSORT 参数调优指南(实用版,针对工业/安防/实时场景)
  • 使用surging 常见的几个问题
  • HTML粒子爱心代码
  • 指针与数组:高效访问的秘诀
  • 918. 环形子数组的最大和
  • JavaScript性能优化实战孟盎
  • 筑牢 AI Agent 关键业务落地的生命线:数据治理与 AI 治理的全体系解析与落地指南
  • 字节一面---客户端开发实习生
  • JavaScript性能优化实战郊蒲
  • 2026年数智项目管理品牌格局观察:平台化与业财融合趋势
  • 2026年四川达州渠县TOP1电器门店:品类超120种堪称全城最全?
  • 比赛吗,就应该有比赛的样子。规则不能够太容易了
  • 跟我学C++中级篇—悲观和乐观锁
  • OpenClaw 生态网站导航推荐
  • Python电商全维数据智能分析与随机森林销量预测系统 Django 可视化 机器学习 爬虫 大数据 大模型 agent 深度学习 计算机毕业设计源码(建议收藏)✅
  • Ruby 类案例
  • Windows实操
  • 嘎嘎降AI为什么能支持9大检测平台?多平台兼容的秘密
  • 双系统安装
  • 基于 PLC 的工业锅炉过程控制程序设计及其仿真
  • 基于离散韦格纳分布(DWVD)结合卷积神经网络(CNN)与长短期记忆网络(LSTM)的故障诊断研究附Matlab代码