LeetCode242. 有效的字母异位词,hash

1. 题目描述

题目来源:https://leetcode.cn/problems/valid-anagram/

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

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

示例1.
输入: s = "anagram", t = "nagaram"
输出: true
示例2. 
输入: s = "rat", t = "car"
输出: false

2. 题解

2.1 解题思路

方法1:使用hash值计算

由于每个字母都有唯一的哈希值,那么一个字符串的哈希值乘积相同,这个字符串包含的元素也一致。算法复杂度为O(n)

代码如下,

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        a = 1
        b = 1
        for i in range(len(s)):
            a *= hash(s[i])
        for i in range(len(t)):
            b *= hash(t[i])
        r = a == b
        return r
if __name__ == '__main__':
    solution = Solution()
    # s = "cat"
    # t = "car"
    s = "anagram"
    t = "nagaram"
    r = solution.isAnagram(s, t)
    print(r)

注意,在Python字母的hash值不同于C++中的ASCII码,连续字母的哈希值不一定是连续的,因此,在Python中,不能通过类似 s[i]-'a' 来得到在有26个字母的列表中 z[i] 的位置索引(C++方法参见https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)。

例如,输出‘a’ ‘b’ ‘c’的hash值如下:

hash('a'): -3155606004080181078
hash('b'): -4333548244287226706
hash('c'): -8353785921970572093

方法2. 字典统计字母出现的次数

Python中的字典:

{key1: val1
 key2: val2
 ...
 keyn: valn}

通过字典统计一个字符串出现的字母以及频数,空间复杂度为O(n),时间复杂度为O(n),代码如下,

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        dict_1 = {}
        dict_2 = {}
        for i in range(len(s)):
            dict_1.setdefault(s[i], 0)
            dict_1[s[i]] += 1
        for i in range(len(t)):
            dict_2.setdefault(t[i], 0)
            dict_2[t[i]] += 1
        # 首先排除s和t包含的字母不一致的情况,返回
        if dict_1.keys() != dict_2.keys():
            return False
        for k,v in dict_1.items():
            if k not in dict_2.keys() or dict_2[k] != v:
                return False
        print(dict_1)
        print(dict_2)
        return True

if __name__ == '__main__':
    solution = Solution()
    # s = "cat"
    # t = "car"
    s = "anagram"
    t = "nagaram"
    r = solution.isAnagram(s, t)
    print(r)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值