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)

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

总结

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

相关推荐
xiaoshiguang34 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡4 小时前
【C语言】判断回文
c语言·学习·算法
别NULL4 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇4 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos6 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习6 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA6 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo6 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc6 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
姚先生976 小时前
LeetCode 54. 螺旋矩阵 (C++实现)
c++·leetcode·矩阵