力扣-第242题《有效的字母异位词》

一 . 问题描述

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

字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。

二 . 了解概念

哈希表(Hash Map)
  • 定义:一种用于存储键值对(Key-Value)的数据结构,通过哈希函数将键映射到存储位置,从而实现高效的插入、删除和查找操作。

  • 在本题中的作用:用于统计每个字符的出现次数。

  • 常用操作

    • put(key, value):插入或更新键值对。

    • get(key):获取键对应的值。

    • getOrDefault(key, defaultValue):获取键对应的值,如果键不存在则返回默认值。

三 . 解题思路

  1. 检查长度:首先检查两个字符串的长度是否相同,如果不同,直接返回 false,因为长度不同的字符串不可能是字母异位词。

  2. 统计字符频率:使用两个哈希表分别统计两个字符串中每个字符的出现频率。

  3. 比较哈希表:最后比较两个哈希表是否完全相同,如果是,则返回 true,否则返回 false

四 . 解题过程

class Solution {
    public boolean isAnagram(String s, String t) {
      if (s.length() != t.length()) {
            return false;
        }
        Map<Character, Integer> mapS = getCharFrequency(s);
        Map<Character, Integer> mapT = getCharFrequency(t);
        return mapS.equals(mapT);
    }

    private static Map<Character, Integer> getCharFrequency(String str) {
        Map<Character, Integer> map = new HashMap<>();
        for (char c : str.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        return map;
    }
}

五 . 时间复杂度和空间复杂度

        一 . 时间复杂度

  • 统计字符频率:遍历字符串 s 和 t,时间复杂度为 O(n),其中 n 是字符串的长度。

  • 比较哈希表:在最坏情况下,需要比较所有字符的频率,时间复杂度为 O(m),其中 m 是字符集的大小(例如小写字母是 26)。

  • 总时间复杂度:O(n + m)。由于 m 通常是固定的(如 26),可以简化为 O(n)。

        二 . 空间复杂度

  • 哈希表存储:使用了两个哈希表来存储字符频率,每个哈希表最多存储 m 个键值对(m 是字符集大小)。

  • 总空间复杂度:O(m)。如果字符集是固定的(如小写字母),可以认为是 O(1)。

六 . 自我反思(优化建议)

  1. 使用数组代替哈希表

    • 如果字符串只包含小写字母(或其他固定范围的字符),可以用一个长度为 26 的数组来统计字符频率。

    • 这样可以减少哈希表的开销,同时数组的比较比哈希表的比较更快。

  2. 提前终止

    • 在统计 t 的字符频率时,如果发现某个字符的计数变为负数,可以立即返回 false,因为这意味着 t 中该字符的出现次数多于 s

    • 这样可以提前终止不必要的计算。

  3. 排序法

    • 将两个字符串排序后直接比较是否相同。

    • 时间复杂度:O(n log n)(排序的复杂度)。

    • 空间复杂度:O(n)(需要额外的空间存储排序后的字符串)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博哥爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值