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

(算法 哈希表)【LeetCode 242】有效的字母异位词

📌 题目链接:242. 有效的字母异位词


题目描述

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

示例 1:

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

示例 2:

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

说明: 你可以假设字符串只包含小写字母。


思路分析

1. 暴力解法

最直接的思路是双层 for 循环,每次从 s 中取出一个字符去 t 里找是否存在。
这种方法不仅需要额外标记字符是否用过,还会导致时间复杂度达到 O(n^2),在字符串很长时效率极低。
因此,我们考虑更优的解法。


2. 哈希表解法

为什么用哈希表(数组)?
  • 本题的关键在于 统计两个字符串中每个字符出现的次数

  • 我们需要快速完成 字符 → 出现次数 的映射。

  • 哈希表(数组)正好适合这种场景。

为什么用数组代替哈希表?
  • 因为题目限定了只包含小写字母 'a' ~ 'z',刚好 26 个字母。

  • 我们可以用一个长度为 26 的数组 record 来代替哈希表,效率更高。

  • 而Hashmap虽然通用性好,但是针对有限少量数据的数据结构,代码实现复杂度较高,不如用哈希表数组实现。

  • record[i] 表示某个字母出现的次数,其中:

    • record[s.charAt(i) - 'a']++ 统计字符串 s

    • record[t.charAt(i) - 'a']-- 抵消字符串 t

最后只要判断 record 中是否所有值都为 0,即可确定两个字符串是否为字母异位词。


动画理解

假设 s = "aee", t = "eae"

  1. 遍历 s

    • arecord[0]++

    • erecord[4]++

    • erecord[4]++
      此时 record[0] = 1, record[4] = 2

  2. 遍历 t

    • erecord[4]--

    • arecord[0]--

    • erecord[4]--
      此时 record[0] = 0, record[4] = 0

最终 record 数组全为 0,说明 st 是异位词。


代码实现(Java)

class Solution {public boolean isAnagram(String s, String t) {// 长度不同直接返回 falseif (s.length() != t.length()) return false;int[] record = new int[26];// 一边统计 s,一边抵消 tfor (int i = 0; i < s.length(); i++) {record[s.charAt(i) - 'a']++;record[t.charAt(i) - 'a']--;}// 检查所有字母出现次数是否归零for (int i = 0; i < 26; i++) {if (record[i] != 0) return false;}return true;}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 为字符串长度。只需一次遍历即可。

  • 空间复杂度:O(1),只使用了固定大小的数组 record[26]


方法对比

方法思路时间复杂度空间复杂度备注
暴力双层循环,逐个匹配O(n^2)O(1)超时不可取
排序排序后比较两个字符串O(n log n)O(1)简单但不够高效
哈希表 Map用 HashMap 统计频次O(n)O(字符集大小)通用性好
数组代替哈希表 ✅26 长度数组统计频次O(n)O(1)本题最佳方案
http://www.xdnf.cn/news/1480033.html

相关文章:

  • 关于 React 19 的四种组件通信方法
  • 十三、计算机领域英语
  • TDengine 时间函数 WEEKOFYEAR() 用户手册
  • 【C++框架#3】Etcd 安装使用
  • Blender 3D建模工具学习笔记
  • LeetCode15:三数之和
  • 《MATLAB 批量把振动 CSV(含中文“序号/采样频率”)稳健转成 .mat:自动解析+统一换算+按 H/I/O/F-rpm-fs-load 命名》
  • WIN10+ubuntu22.04.05双系统装机教程
  • 基于STM32F103C8T6的心率与体温监测及报警显示系统设计
  • 如何在 FastAPI 中巧妙覆盖依赖注入并拦截第三方服务调用?
  • vue + ant-design-vue + vuedraggable 实现可视化表单设计器
  • 用 PHP 玩向量数据库:一个从小说网站开始的小尝试
  • 多维度数据统一线性处理的常见方案
  • 鸿蒙libxm2交叉编译
  • (2)桌面云、并行计算、分布式、网格计算
  • LeetCode5最长回文子串
  • 基于Spark的中文文本情感分析系统研究
  • 空间配置器
  • 【STM32HAL-----NRF24L01】
  • leetcode LCR 159 库存管理III
  • Qt网络通信服务端与客户端学习
  • 第5章递归:分治法
  • Qt文字滚动效果学习
  • MySQL 高可用方案之 MHA 架构搭建与实践
  • 常用配置文件
  • 去中心化投票系统开发教程 第三章:智能合约设计与开发
  • [网络入侵AI检测] docs | 任务二分类与多分类
  • 算法题-链表03
  • react native 出现 FATAL EXCEPTION: OkHttp Dispatcher
  • LeetCode 2841.几乎唯一子数组的最大和