【LeetCode刷题日记】242.字母异位词

🔥个人主页:北极的代码(欢迎来访)

🎬作者简介:java后端学习者

❄️个人专栏:苍穹外卖日记SSM框架深入JavaWeb

命运的结局尽可永在,不屈的挑战却不可须臾或缺!

前言:前面我们已经学习了关于哈希表的相关知识并深入了解了哈希表的底层逻辑,这些都是面试的高频考点,现在我们具体在题目中应用这些知识!

题目背景:LeetCode242

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的 字母异位词。

示例 1:

复制代码
输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

复制代码
输入: s = "rat", t = "car"
输出: false

提示:

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

**进阶:**如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

题目答案:

java 复制代码
/**
 * 242. 有效的字母异位词 字典解法
 * 时间复杂度O(m+n) 空间复杂度O(1)
 */
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];

        for (int i = 0; i < s.length(); i++) {
            record[s.charAt(i) - 'a']++;     // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
        }

        for (int i = 0; i < t.length(); i++) {
            record[t.charAt(i) - 'a']--;
        }
        
        for (int count: record) {
            if (count != 0) {               // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        return true;                        // record数组所有元素都为零0,说明字符串s和t是字母异位词
    }
}

题目解析:

先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。

暴力的方法这里就不做介绍了,直接看一下有没有更优的方式。

数组其实就是一个简单哈希表,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。

由于我们要记录字母,一共有26个字母,所以我们创建的数组大小也就是26,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。

关于操作步骤如图:

定义一个数组叫做record用来上记录字符串s里字符出现的次数。

需要把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。

再遍历 字符串s的时候,只需要将 s[i] - 'a' 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。 这样就将字符串s中字符出现的次数,统计出来了。

这里具体说明一下:

复制代码
 record[s.charAt(i) - 'a']++;  

关于这个操作,首先调用charAt()方法,拿到字符串的第i个字符

然后-'a',实际是减去a的ACII码值,所以结果一定是0-25之间的,因为最小只能是a,最大是z,将这个整数当成字母的下标

此时record[]这个整体代表record[0] ,然后后面自增,这个位置的值就变成1了,因为设置数组的时候,默认26个位置都是0,所以把数值自增,或者自减都是加1或者减1。

之后同一个道理,同一位置,之后进行自减,如果是相同的字母,那必定就是在record的同一位置,之后自减。

结语:如果对你有帮助,请**点赞,关注,收藏,**你的支持就是我最大的帮助!

相关推荐
cpp_250110 小时前
P1024 [NOIP 2001 提高组] 一元三次方程求解
数据结构·c++·算法·题解·二分答案·洛谷·csp
田梓燊17 小时前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
re林檎17 小时前
算法札记——4.27
算法
数据牧羊人的成长笔记18 小时前
逻辑回归与Softmax回归
算法·回归·逻辑回归
郑州光合科技余经理18 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
d111111111d21 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
Jiangxl~1 天前
IP数据云如何为不同行业提供精准IP查询与风险防控解决方案?
网络·网络协议·tcp/ip·算法·ai·ip·安全架构
李伟_Li慢慢1 天前
wolfram详解山峦算法
前端·算法
counting money1 天前
prim算法最小生成树(java)
算法
澈2071 天前
C++面向对象:类与对象核心解析
c++·算法