Leetcode 每日一题 242.有效的字母异位词

目录

问题描述

示例

题目要求

解决方案

算法思路

过题图片

代码实现

算法分析

优化思路

优化后的代码实现

优化后的算法分析

题目链接


问题描述

给定两个字符串 s 和 t,我们需要编写一个函数来判断 t 是否是 s 的字母异位词。字母异位词指的是两个字符串包含相同的字符,并且每个字符出现的次数也相同。

示例

  1. 输入:s = "anagram", t = "nagaram",输出:true
  2. 输入:s = "rat", t = "car",输出:false

题目要求

  • 输入的字符串长度在 1 到 5 * 10^4 之间。
  • 字符串 s 和 t 仅包含小写字母。

解决方案

算法思路

为了解决这个问题,我们可以采用以下步骤:

  1. 长度比较:首先,如果两个字符串的长度不同,那么它们不可能是字母异位词。
  2. 字符计数:对于相同长度的字符串,我们可以统计每个字符串中每个字符出现的次数。
  3. 比较字符计数:如果两个字符串的字符计数完全相同,那么它们就是字母异位词。

过题图片

代码实现

复制代码

java

复制代码
import java.util.Arrays;

class Solution {
    public boolean isAnagram(String s, String t) {
        // 如果两个字符串都为空,它们是字母异位词
        if (s.isEmpty() && t.isEmpty()) {
            return true;
        }
        // 如果长度不同,它们不可能是字母异位词
        if (s.length() != t.length()) {
            return false;
        }
        // 将字符串转换为字符数组
        char[] sArray = s.toCharArray();
        char[] tArray = t.toCharArray();
        // 对两个字符数组进行排序
        Arrays.sort(sArray);
        Arrays.sort(tArray);
        // 比较排序后的数组是否相等
        return Arrays.equals(sArray, tArray);
    }
}

算法分析

  • 时间复杂度 :排序操作的时间复杂度为 O(n log n),其中 n 是字符串的长度。
  • 空间复杂度 :O(n),用于存储两个字符串的字符数组。

优化思路

虽然排序的方法简单直观,但在某些情况下可能不是最优解。我们可以通过使用哈希表来统计每个字符的出现次数,这样可以将时间复杂度降低到 O(n)。

优化后的代码实现

复制代码

java

复制代码
class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] count = new int[26]; // 小写字母共有26个
        for (int i = 0; i < s.length(); i++) {
            count[s.charAt(i) - 'a']++;
            count[t.charAt(i) - 'a']--;
        }
        // 检查计数器是否都为0
        for (int i : count) {
            if (i != 0) {
                return false;
            }
        }
        return true;
    }
}

优化后的算法分析

  • 时间复杂度 :O(n),其中 n 是字符串的长度。
  • 空间复杂度 :O(1),因为我们只使用了一个固定大小的数组来存储字符计数。

排序方法

  • 优点:实现简单,直观。
  • 缺点 :时间复杂度较高,为 O(n log n),其中 n 是字符串的长度。
  • 适用场景:当字符串较短或者对时间复杂度要求不高时,可以使用这种方法。

哈希表计数方法

  • 优点 :时间复杂度低,为 O(n),适用于较长的字符串。
  • 缺点:需要额外的空间来存储字符计数。
  • 适用场景:当处理较长的字符串或者对性能要求较高时,推荐使用这种方法。

题目链接

242. 有效的字母异位词 - 力扣(LeetCode)

通过这种方式,我们能够更高效地判断两个字符串是否为字母异位词。

总结

对于字母异位词的问题,我们可以根据实际情况选择不同的算法。如果对性能有较高要求,推荐使用哈希表计数方法,因为它的时间复杂度更低。如果字符串较短,或者实现的简便性更重要,排序方法也是一个不错的选择。

相关推荐
zh_xuan1 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长1 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
早起CaiCai2 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码3 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
猿人谷3 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
文丑颜不良啊4 小时前
LeetCode2241~2260题目解析
java·leetcode
文丑颜不良啊4 小时前
LeetCode2321~2340题目解析
java·leetcode
青少儿编程课堂4 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
在猴站学算法5 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习