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

LeetCode 242. 有效的字母异位词(C语言详解 | 哈希计数法)

一、题目描述

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

字母异位词(Anagram)指的是由相同字母重新排列形成的字符串。

示例

示例 1:

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

示例 2:

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

提示

  • 1 <= s.length, t.length <= 5 * 10^4

  • st仅包含小写字母

进阶:如果字符串包含Unicode 字符,应该如何处理?


二、解题思路

判断两个字符串是否为字母异位词,本质就是:

两个字符串中每个字符出现的次数必须完全相同。

例如:

s = anagram t = nagaram

统计字符出现次数:

字符次数
a3
n1
g1
r1
m1

两个字符串统计结果完全一致,因此是字母异位词

由于题目说明只包含小写字母 a-z,我们可以使用一个长度为 26 的数组来统计字符出现次数。

算法步骤

  1. 如果两个字符串长度不同,直接返回false

  2. 创建数组count[26]

  3. 遍历字符串s,统计字符出现次数

  4. 遍历字符串t,减少对应字符次数

  5. 如果最终数组全部为0,说明字符数量完全一致


三、代码实现(C语言)

#include <stdbool.h> #include <string.h> bool isAnagram(char* s, char* t) { int len1 = strlen(s); int len2 = strlen(t); // 长度不同直接返回 if (len1 != len2) { return false; } int count[26] = {0}; // 统计字符次数 for (int i = 0; i < len1; i++) { count[s[i] - 'a']++; count[t[i] - 'a']--; } // 判断是否全部为0 for (int i = 0; i < 26; i++) { if (count[i] != 0) { return false; } } return true; }

四、复杂度分析

类型复杂度
时间复杂度O(n)
空间复杂度O(1)

说明:

  • 只需要遍历一次字符串

  • 使用固定大小26的数组,因此空间复杂度为常数级


五、优化写法(推荐)

可以在同一次循环中同时进行加减操作,代码更加简洁。

#include <stdbool.h> #include <string.h> bool isAnagram(char* s, char* t) { if (strlen(s) != strlen(t)) return false; int count[26] = {0}; for (int i = 0; s[i] != '\0'; i++) { count[s[i] - 'a']++; count[t[i] - 'a']--; } for (int i = 0; i < 26; i++) { if (count[i] != 0) return false; } return true; }

六、进阶问题:如果包含 Unicode 字符怎么办?

如果字符串包含Unicode 字符,字符集会非常大,此时无法使用26的数组。

可以采用:

方法:哈希表

思路:

  1. 使用哈希表统计s中字符出现次数

  2. 遍历t,减少对应字符次数

  3. 如果某个字符次数小于 0,则不是异位词

在 C 语言中可以:

  • 使用uthash

  • 或自己实现哈希表

时间复杂度仍然是:

O(n)

七、总结

判断字母异位词的核心思想是:

统计字符出现次数是否完全一致。

常见解法:

1️⃣计数数组(推荐)

  • 时间复杂度:O(n)

  • 空间复杂度:O(1)

2️⃣排序比较

  • 排序两个字符串后比较

  • 时间复杂度:O(n log n)

在面试和算法题中,计数数组是最优解法

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

相关文章:

  • 2026年面向喷墨印刷系统优质超声波流量传感器品牌推荐 - 品牌2026
  • 2026去屑控油蓬松洗发水专业测评油头头屑党闭眼入蓬松神器 - 资讯焦点
  • Langgraph 5. 工具使用 Tool Use(Function Calling)
  • 变量的定义与分类
  • 2026年米特科斯鱼片机性价比分析,质量好不好看这里 - 工业品网
  • 多路io(select/epoll)
  • 光伏电池建模及仿真:探索PV曲线与IV曲线的奥秘
  • 2026年上海热门的别墅座椅电梯厂家,Uzin优行值得选吗 - 工业设备
  • 2026做轻量化单兵无人机系统比较好的公司有哪些推荐?猎翼无人机的飞行体验 - 品牌2026
  • 阿里云轻量服务器搭建 WireGuard (wg-easy) 指南
  • DevOps技术面试指南:容器、云原生与内核核心问题
  • ACWing 3497 质数
  • 浙江润鑫轴线车无线汽车称重仪:智能无线传输,称重检测一步到位 - 速递信息
  • 【操作系统学习日记】《现代处理器性能的三重奏:ISA架构、流水线与缓存系统》
  • 基于C# WinForm的PLC通讯上位机开发之旅:Modbus协议与SQL 2008的融合
  • 探索微观孔隙建模插件:开启多领域模拟的新大门
  • 【LeetCode】1. 两数之和(Two Sum)— 哈希表经典题解(C语言)
  • ESP32-S3 基础介绍
  • 探索 COMSOL 中含裂缝地层的流动与传热耦合模拟:油藏数值模拟实战
  • 基于二进制粒子群算法的配电网故障诊断—Matlab 应用选取配电网故障诊断,采用二进制粒子群优化算法
  • 自动药片装瓶机的“神经中枢“是如何炼成的
  • CPU_多线程操作图片_代码详解
  • 纯电动汽车动力经济性仿真:Cruise 与 Simulink 联合之旅
  • 【教学类-133-01】20260309狮虎旗(井字棋)01豆包初稿HTML+ CSS + JavaScript
  • 西门子200smart模拟量处理:滤波与报警的完美结合
  • 从DeepSig RadioML 2018.01A到定制化数据集:单信噪比单调制数据的提取与实战应用
  • 玩转PLC液体混合作业线(附全套工业组态方案)
  • 性价比优先:预算低情景下自动化立体仓库公司的选型指南 - 品牌策略主理人
  • Claude Code Hooks 实战:8大事件与10+脚本的自动化开发指南
  • STM32四轴联动运动控制:直线圆弧插补技术,编码器反馈与加减速控制,原理图和源代码全解析