力扣 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结构) 做减法。

posted @   YIMENG-0  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示