代码随想录算法训练营打卡day05-1|242 有效的字母异位词(用数组做哈希表)

学习来自《代码随想录》

建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。

题目链接/文章讲解/视频讲解:

代码随想录

题目:力扣题目链接

视频:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词

242 有效的字母异位词(用数组做哈希表)

题目描述

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"

输出: true

示例 2:

输入: s = "rat", t = "car"

输出: false

思路

我的思路(用map实现)

1、遍历字符串s,用一个表记录字母及其出现的次数,

2、再遍历字符串t,查找在表中是否存在相同的字母,如果有则将其次数减1。如果出现找不到字母的情况,则直接返回false。

3、最后检查表中每个字母的次数,如果有不为0 的,返回false,否则返回true。

题解思路:(用数组实现哈希表)

1、定义一个长度为26的数组,初始化值为0

2、遍历字符串s,在其字母的相对位置+1,记录字母出现的次数

3、再遍历字符串t,将字母对应位置的数字减1

4、最后检查数组每个位置的数字,如果有不为0 的,返回false,否则返回true。

代码

方法一:用数组实现哈希表

java版本

在实现中的代码问题

1、计算数组下标:s.charAt(i) - 'a'

而不是s[i] - 'a',否则会报错:

Line 5: error: array required, but String found

hashArray[s[i] - 'a']++;

charAt() 方法 属于java String 类,用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。

2、计算字符串的长度:s.length()

计算数组的长度:array.length

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] hashArray=  new int[26];
        for(int i = 0; i < s.length(); i++){
            hashArray[s.charAt(i) - 'a']++;
        }
        for(int j = 0; j < t.length(); j++){
            hashArray[t.charAt(j) - 'a']--;
        }
        for(int k = 0; k < hashArray.length; k++){
            if(hashArray[k] != 0)
                return false;
        }
        return true;
    }
}

复杂度分析:

时间复杂度:O(n)

空间复杂度:O(1)

python 版本

在实现中的代码问题

1、计算列表下标:ord(i) - ord('a'),

而不是s[i] - 'a'也不是int(s[i] - 'a')

TypeError:string indices must be integers(字符串索引必须是整数)

也不是i-'a': TypeError: unsupported operand type(s) for -: 'str' and 'str'

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        list = [0 for _ in range(26)]

        for i in s:
            list[ord(i) - ord('a')] += 1

        for i in t:
            list[ord(i) - ord('a')] -=1

        for k in list:
            if k != 0:  #注意不要写成list[k] !=0
                return False

        return True

方法二:(python)使用collections模块中的defaultdict类

思路:
将s 、t分别存入两个defaultdict中,完成统计每个字符的统计工作,再比较两个defaultdict,如果一致说明每个字符出现的次数相等,是有效的字母异位词。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import defaultdict
        
        s_dict = defaultdict(int)
        t_dict = defaultdict(int)
        for x in s:
            s_dict[x] += 1
        
        for x in t:
            t_dict[x] += 1
        return s_dict == t_dict

方法三:(python)使用collections模块中的Counter类(计数器)

class Solution(object):
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import Counter
        a_count = Counter(s)
        b_count = Counter(t)
        return a_count == b_count

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值