leetcode242
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
容易想到哈希表
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hash_dic = dict()
for letter in s:
if letter in hash_dic.keys():
hash_dic[letter] += 1
else:
hash_dic[letter] = 1
try:
for letter in t:
hash_dic[letter] -= 1
except KeyError:
return False
for key in hash_dic.keys():
if hash_dic[key] != 0:
return False
return True
在进行第二次循环,即字符串t的循环过程中,考虑到t中的字母可能没有在s中出现过,因此写一个try-except代码块(开始写代码时错误类型还记错了:写的是ValueError,结果报错是KeyError)。这样不是很方便,因此查阅了资料,了解了一种新的字典数据类型defaultdict,顾名思义,与普通的字典不同,defaultdict可以在初始化时指定一个默认值类型,并在访问不存在的键时返回该默认值,而不会引发KeyError异常。
当访问一个不存在的键时,defaultdict会自动调用这个可调用对象来生成默认值,并将其关联到相应的键上。
# 创建一个defaultdict,默认值为int类型的0
scores = defaultdict(int)
因此上边代码可以改为使用defaultdict数据类型,而不必使用try-except代码块。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hash_dic = defaultdict(int)
for letter in s:
if letter in hash_dic.keys():
hash_dic[letter] += 1
else:
hash_dic[letter] = 1
for letter in t:
hash_dic[letter] -= 1
for key in hash_dic.keys():
if hash_dic[key] != 0:
return False
return True
发现了一个更为简洁的版本:但是使用了两个字典,空间复杂度要高一点
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dic1 = defaultdict(int)
dic2 = defaultdict(int)
for letter in s:
dic1[item] += 1
for letter in t:
dic2[item] += 1
return dic1 == dic2