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)

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

总结

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

相关推荐
De-Alf5 小时前
Megatron-LM学习笔记(6)Megatron Model Attention注意力与MLA
笔记·学习·算法·ai
2401_841495645 小时前
【LeetCode刷题】打家劫舍
数据结构·python·算法·leetcode·动态规划·数组·传统dp数组
冰西瓜6006 小时前
STL——vector
数据结构·c++·算法
天呐草莓6 小时前
集成学习 (ensemble learning)
人工智能·python·深度学习·算法·机器学习·数据挖掘·集成学习
努力学算法的蒟蒻6 小时前
day45(12.26)——leetcode面试经典150
算法·leetcode·面试
闻缺陷则喜何志丹6 小时前
【离线查询 前缀和 二分查找 栈】P12271 [蓝桥杯 2024 国 Python B] 括号与字母|普及+
c++·算法·前缀和·蓝桥杯·二分查找··离线查询
夏幻灵6 小时前
为什么要配置环境变量?
笔记·算法
铭哥的编程日记6 小时前
Manacher算法解决所有回文串问题 (覆盖所有题型)
算法
LYFlied6 小时前
【每日算法】LeetCode 300. 最长递增子序列
前端·数据结构·算法·leetcode·职场和发展
ohnoooo96 小时前
251225 算法2 期末练习
算法·动态规划·图论