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

目录

问题描述

示例

题目要求

解决方案

算法思路

过题图片

代码实现

算法分析

优化思路

优化后的代码实现

优化后的算法分析

题目链接


问题描述

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

示例

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

题目要求

  • 输入的字符串长度在 15 * 10^4 之间。
  • 字符串 st 仅包含小写字母。

解决方案

算法思路

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

  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)

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

总结

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

相关推荐
fie88892 小时前
NSCT(非下采样轮廓波变换)的分解和重建程序
算法
晨晖22 小时前
单链表逆转,c语言
c语言·数据结构·算法
YoungHong19923 小时前
面试经典150题[072]:从前序与中序遍历序列构造二叉树(LeetCode 105)
leetcode·面试·职场和发展
im_AMBER4 小时前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
鼾声鼾语4 小时前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
LYFlied5 小时前
【每日算法】LeetCode 25. K 个一组翻转链表
算法·leetcode·链表
Swizard5 小时前
别再迷信“准确率”了!一文读懂 AI 图像分割的黄金标尺 —— Dice 系数
python·算法·训练
s09071365 小时前
紧凑型3D成像声纳实现路径
算法·3d·声呐·前视多波束
可爱的小小小狼5 小时前
算法:二叉树遍历
算法
d111111111d6 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法