字典的本质:
其内部是一个数组
将 key 通过一个hash function 计算出一个整数, 让后将计算出一个整数%数组长度求余
得出index, 将value存入该index对应的地址中
set 只有key, 没有value的dict.
对于dict, 所有的操作的时间复杂度都是O(1), 但是空间复杂度为O(n)
对于题目中出现:
计数
有没有出现过(set)
有没有重复
以上字眼可以考虑使用dict
dict中可存入 <key, 次数> 和 <key, 索引>
1. 计数字符串中字符出现的次数
def letter_count(s):
freq = {}
for i in s:
if i.isalpha():
freq[i] = 1 + freq.get(i, 0)
return freq
2. 找出字符串中字符出现次数最大的字符
思路: 先计算, 再遍历
def max_letter_count(s):
freq = {}
for i in s:
if i.isalpha():
freq[i] = 1 + freq.get(i, 0)
max_count = 0
max_letter = 0
for key, val in freq.items():
if val > max_count:
max_count = val
max_letter = key
return max_letter,max_count
3. 找出字符串第一个没有重复出现的字符,并返回字符所在是位置(索引)
如: s = 'givenastring' 字符v是第一没有重复的字符, 所以
思路: 先使用dict对字符串中每一个字符计数
然后遍历字符串, 当该字符出现的次数为1时,则返回索引
def first_unqie_letter(s):
freq = {}
for i in s:
if i.isalpha():
freq[i] = 1 + freq.get(i, 0) # 计数
for i in range(len(s)):
if freq.get(s[i]) == 1: # 出现1则返回
return i
return -1
4. 找出两个数组中的公共元素
思路: 将数组1存入set中, 遍历数组2, 判断每一个元素是否在数组1中出现过
def intersection(arra1, arra2):
a1 = set(arra1)
ret = []
for i in arra2:
if i in a1:
ret.append(i)
return ret
使用python中set的特性, 一句代码: set(arra1) & set(arra2)
5. 计数字符串s1中的字符在字符串s2出现的次数和
比如: s1 = 'aA' s2 = 'aAAbbb' 输出 3
s1 = 'z' s2 = 'ZZ' 输出 0
思路: 暴力解法, 两层for循环
def count_letter(s1, s2):
count=0
for i in s1:
for j in s2:
if i == j:
count += 1
return count
使用set降低时间复杂度
def count_letter(s1, s2):
count=0
s = set(s1)
for i in s2:
if i in s:
count += 1
return count
6. 判断一个字符串中是否有重复的字符
思路1: 将字符串放入set后的长度和字符串的长度将那些比较是否相等
def is_contains_duplicate(s):
return not (len(s) == len(set(s)))
思路2: 使用dict存储key,count, 出现count = 2,则返回False
def is_contains_duplicate(s):
d = {}
for index, value in enumerate(s):
# 对于一边存储一边判断(累计求值, 比如求和等)的,一定要先进行存储, 再进行判断
d[value] = 1 if value not in d else d[value] + 1
if value in d and d.get(value) >= 2:
return True
return False
7. 判断一个字符串中是否有重复的字符, 并且重复字符所在索引的差小于等于k
思路: for 循环时借助dict进行判断, 如果再dict不存在则存入,
如果存在则进行判断
def is_contain_duplicate(s, k):
d = {}
for idx, val in enumerate(s):
if val in d and (idx - d.get(val)) >= k:
return True
else:
# 判断是否存在val, 如果不进行判断对 s='aaba' ,k = 3这样的则有问题
if val not in d:
d[val] = idx
return False