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值计算
由于每个字母都有唯一的哈希值,那么一个字符串的哈希值乘积相同,这个字符串包含的元素也一致。算法复杂度为。
代码如下,
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}
通过字典统计一个字符串出现的字母以及频数,空间复杂度为,时间复杂度为,代码如下,
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)