本篇文章讲解一下哈希表最基本的应用
哈希表主要有三种,分别是数组,set,map,在python中是list,set和字典
本文分别介绍这三种方法在题目中的应用
总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
如果需要判断一个元素是否出现过的场景也应该第一时间想到哈希法。哈希表尤其在不需要考虑顺序只需要考虑是否出现,是否一致,是否存在的时候
242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false
- 数组解法
数组解法存在限制,因为数组是连续的,因此如果题目所给待存储内容较大,无法使用数组,如变量范围在0-2的32次方,如果存储2的32次方在数组中,就要建立这么大的一个数组,显然是不现实的,因此数组适合较小的取值范围,如果过大就需要用字典
1. class Solution:
2. def isAnagram(self, s: str, t: str) -> bool:
3. record1=[0]*26
4. record2=[0]*26
5. for i in s:
6. record1[ord(i)-ord("a")]+=1
7. for i in t:
8. record2[ord(i)-ord("a")]+=1
9. return record1==record2
因为题目给了限定是小写,因此数目局限在26个以内,可以使用数组,只是需要把字符串以数字形式代表,方便存储,比如record[0]=2 意思就是有两个a
2. 字典解法
数组解法限制较多,只能存储数字,并且范围还不能太多,那么字典没有这么多要求,python中字典可以直接使用函数Counter,自动把输入转换成字典形式的结构,也可以手动一个个输入,接下来分别展示这两种方法
Counter函数
1. class Solution:
2. def isAnagram(self, s: str, t: str) -> bool:
3. n1=Counter(s)
4. n2=Counter(t)
5. return n1==n2
直接建立字典{}
1. class Solution:
2. def isAnagram(self, s: str, t: str) -> bool:
3. a={}
4. for i in s:
5. if i in a:
6. a[i]+=1
7. else:
8. a[i]=1
9. for i in t:
10. if i in a:
11. a[i]-=1
12. else:
13. return False
14. for i in a:
15. if a[i] !=0:
16. return False
17. return True
当然也可以建立两个字典直接比较是否相等,就不需要循环判断了,时间换空间
3. set
对于set的使用,我们用另一道题目来分析
349. 两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。
在不需要考虑该元素出现次数的时候,set更合适,因为set自动过滤掉了重复的元素,set内的所以元素都是不相同的
- class Solution:
-
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
-
res=[]
-
nu1=set(nums1)
-
nu2=set(nums2)
-
for i in nu1:
-
if i in nu2:
-
res.append(i)
-
return res
-
#return list(nu1&nu2)
Set集合还可以取交集,十分方便