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)

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

总结

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

相关推荐
zyl76513 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖17 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌17 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F18 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791318 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032218 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!18 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
2501_9269783318 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师18 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
无定义_18 小时前
10.11日常训练
算法