力扣 242 有效的字母异位词基于哈希表实现
题目链接
https://leetcode-cn.com/problems/valid-anagram/
源代码 github 地址
https://github.com/YIMEng-0/DataStructure
1、题目要求
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
字母异位词的概念:
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
简单理解就是:两个字符串长度一样,构成字符串的每个字符只是排列的顺序不一样,含有的具体字符以及具体字符的个数是一样的;
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
2、思路分析 基于哈希表
- 通过将字符串中的每一个字符进行散列处理,哈希表维护对应字符的频次即可;
- 相同的字符散列的结果是相同的,修改散列的下标对应的 value 数值,出现一次 value 就加一的操作;
- 同时对于另一个字符串修改散列的下标对应的 value 数值,出现一次 value 就减一的操作;
3、执行代码
class Solution {
public boolean isAnagram(String s, String t) {
// 除了使用排序的方式直接进行比较之外,可以使用哈希表m也就是使用数组进行字母的异位词的判断
// 将元素存储在哈希表中,使用散列的方式维护一个字符出现的频数表
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> table = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < t.length(); i++) {
char ch = t.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) - 1);
if (table.get(ch) < 0) {
return false;
}
}
return true;
}
}
4、问题反思
4.1、为什么哈希表的构造是 Map<Character,Integer>
?
将字符串中的每个字符计算出来哈希表中的存储位置,存储的数值是 Integer 数据类型的,也就是存储的是字符出现的频次;
4.2、对于table.put(ch, table.getOrDefault(ch, 0) + 1);
的理解
首先是 put 函数,哈希表通过 put 函数进行元素的存储;
table.getOrDefault(ch, 0) + 1 这个是存储的字符出现的次数,也就是频次;
getOrDefault(ch, 0) 这个调用的是根据 key 获取 value ,也就是根据 key 获取字符以前出现的频次;
4.3 为什么判断的条件是 if (table.get(ch) < 0)
的理解?
if (table.get(ch) < 0) {
return false;
}
因为一旦哈希表中的某个 key 出现的次数是负数的话,说明两个字符串不可能相同,因为先是s 字符串对哈希表 value 做加法操作,然后 t 字符串对哈希表 value 做加法操作,最多减为 0 ,出现了负数,一定是不符合字母异位词的定义的;
5、小结
通过了哈希表的数据结构,记录了一个字符串中字符出现的频次,s 字符串中是在哈希表的 value(key - value 结构) 做加法,t 字符串中是在哈希表的 value(key - value结构) 做减法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!