力扣经典150题第四十一题:有效的字母异位词

server/2024/9/23 5:55:45/

目录

  • 力扣经典150题第四十二题:有效的字母异位词
    • 引言
    • 题目详解
    • 解题思路
    • 代码实现
    • 示例演示
    • 复杂度分析

力扣经典150题第四十二题:有效的字母异位词

引言

本篇博客介绍了力扣经典150题中的第四十二题:有效的字母异位词。题目要求判断给定的字符串 t 是否是字符串 s 的字母异位词。

字母异位词的定义是:如果 st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

题目详解

给定两个字符串 st,判断 t 是否是 s 的字母异位词。
示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:

输入: s = “rat”, t = “car”
输出: false

提示:

1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

解题思路

为了判断字符串 t 是否是字符串 s 的字母异位词,可以使用两种方法:

  1. 排序法: 将字符串 st 分别排序,然后比较排序后的结果是否相等。时间复杂度为 O(n log n)。

  2. 哈希表法: 使用哈希表记录字符串 s 中每个字符出现的次数,然后遍历字符串 t,逐个减少哈希表中对应字符的计数。如果在减少过程中发现某个字符的计数小于零,或者最终哈希表中存在计数不为零的字符,则返回 false

    • 进阶要求:如果输入字符串包含 unicode 字符,可以使用哈希表存储字符的计数。

具体步骤如下:

  1. 如果 st 的长度不相等,直接返回 false
  2. 使用长度为 26 的整型数组 count 来记录字符出现的次数,索引为字符的 ASCII 值减去 ‘a’ 的 ASCII 值。
  3. 遍历字符串 s,统计每个字符的出现次数。
  4. 遍历字符串 t,逐个减少 count 中对应字符的计数。
  5. 如果在减少过程中发现某个字符的计数小于零,或者最终 count 中存在计数不为零的字符,返回 false
  6. 如果遍历完成后没有发现不符合条件的情况,返回 true

通过上述步骤,可以判断字符串 t 是否是字符串 s 的字母异位词。

代码实现

public class ValidAnagram {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) {return false;}int[] count = new int[26]; // 存储字符出现的次数,26个字母// 统计字符串 s 中每个字符出现的次数for (char c : s.toCharArray()) {count[c - 'a']++;}// 逐个减少 count 中对应字符的计数for (char c : t.toCharArray()) {count[c - 'a']--;if (count[c - 'a'] < 0) {return false; // 如果字符出现次数小于零,返回 false}}// 检查 count 中是否存在计数不为零的字符for (int num : count) {if (num != 0) {return false;}}return true;}public static void main(String[] args) {ValidAnagram solution = new ValidAnagram();// 示例测试String s1 = "anagram";String t1 = "nagaram";System.out.println("s: " + s1 + ", t: " + t1);System.out.println("结果: " + solution.isAnagram(s1, t1));String s2 = "rat";String t2 = "car";System.out.println("s: " + s2 + ", t: " + t2);System.out.println("结果: " + solution.isAnagram(s2, t2));}
}

示例演示

展示了两个不同的示例测试,验证了字符串 t 是否是字符串 s 的字母异位词的功能。

复杂度分析

该解法的时间复杂度为 O(n),其中 n 是字符串 s 的长度。空间复杂度为 O(1),因为哈希表的大小是固定的(26 个字母)。


http://www.ppmy.cn/server/14568.html

相关文章

2024护眼台灯哪个牌子好?盘点目前比较好用的护眼台灯

在日常生活中&#xff0c;照明环境的好坏直接关系到我们的视力健康。为此&#xff0c;护眼台灯作为一种专为缓解眼部疲劳和保护视力而设计的照明设备&#xff0c;受到了广大用户的青睐。然而&#xff0c;面对市场上众多的护眼台灯品牌&#xff0c;消费者往往难以抉择。2024护眼…

MySql 查询优化

MySQL查询优化涉及多个方面&#xff0c;包括索引优化、查询优化、服务器配置优化等。以下是一些基本的查询优化技巧&#xff1a; 1.使用索引 确保你的查询利用了适当的索引。 SELECT * FROM table_name WHERE column_name value; 2.避免SELECT * 只选择需要的列&#xff…

企业为什么要选择通配符SSL证书使用?

企业选择使用通配符SSL证书主要是出于以下几个重要原因&#xff1a; 1. 经济性&#xff1a; - 节省成本&#xff1a;相较于为每一个子域名单独购买并维护单独的SSL证书&#xff0c;通配符证书能够以一张证书覆盖同一主域名下的所有同级子域名&#xff0c;无需为新增或已有的子域…

Python 网络与并发编程(四)

文章目录 协程Coroutines协程的核心(控制流的让出和恢复)协程和多线程比较协程的优点协程的缺点 asyncio实现协程(重点) 协程Coroutines 协程&#xff0c;全称是“协同程序”&#xff0c;用来实现任务协作。是一种在线程中&#xff0c;比线程更加轻量级的存在&#xff0c;由程…

mapbox中filter表达式

起初让我研究的原因使一个报错&#xff1a; layers.TRSA.filter[2][1][2]: string, number, or boolean expected, array found 我很确定筛选条件没问题&#xff0c;那么为何报错呢&#xff1f;百度&#xff0c;找到原因&#xff1a; https://docs.mapbox.com/style-spec/refe…

探索Java设计模式:模板方法模式

探索Java设计模式&#xff1a;深入理解与实践模板方法模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改变算法整体结构的情况下重定义某些步骤。在Java编程中&#xff…

CUDA入门系列课程,从最基础着手

CUDA入门系列课程&#xff0c;从最基础着手&#xff0c;突出的就是一个字“细”&#xff01;&#xff01; github项目包含代码、博客、课件pdf下载地址&#xff1a;https://github.com/sangyc10/CUDA-code! 在这里插入图片描述 CUDA编程基础入门系列 https://github.com/sang…

【方法】如何禁止打印PDF文件?

很多时候&#xff0c;我们创建的PDF文档都包含重要信息&#xff0c;想要保护文档不能被随意打印&#xff0c;确保文档的安全及机密性&#xff0c;只要给PDF设置打印权限就可以了。下面一起来看看如何操作&#xff01; PDF的打印权限可以通过密码来实现&#xff0c;通过设置权限…