问题描述
在一个超市里,有一个包含
n个格子的货物架,每个格子中放有一种商品,商品用小写字母a到z表示。当顾客进入超市时,他们会依次从第一个格子查找到第n个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。 作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
解题思路
- 题目很长,但思路很简单,不要被吓到。顾客想买的是想要的商品,而货物架上的摆放只是形式,那么可以通过种类以及数量的对比得到答案,用字典类型存储商品种类以及数量,遍历顾客想要的商品时,如果字典中有该商品,那么修改卖出商品的数量,以及字典中键对应的值,得到最终的结果。
- 以
s = "bcdea",c = "abcd"为例,首先用hashmap_products存储种类以及数量,那么遍历完货物架上商品时,hashmap_products为{'b':1, 'c':1, 'd':1, 'e':1, 'a':1},卖出商品result为0 - 然后遍历顾客想要购买的商品,首先遍历第一个商品
a,hashmap_products总有商品a,因此卖出商品加1,货物架商品减1。此时hashmap_products为{'b':1, 'c':1, 'd':1, 'e':1, 'a':0},result为1 - 然后遍历第二个商品
b,hashmap_products总有商品b,因此卖出商品加1,货物架商品减1。此时hashmap_products为{'b':0, 'c':1, 'd':1, 'e':1, 'a':0},result为2 - 接着遍历第三个商品
c,hashmap_products总有商品c,因此卖出商品加1,货物架商品减1。此时hashmap_products为{'b':0, 'c':0, 'd':1, 'e':1, 'a':0},result为3 - 最后遍历第四个商品
d,hashmap_products总有商品d,因此卖出商品加1,货物架商品减1。此时hashmap_products为{'b':0, 'c':0, 'd':0, 'e':1, 'a':0},result为4
def solution(n: int, m: int, s: str, c: str) -> int:
# 新建一个字典类型,用于存放商品种类以及数量
hashmap_products = {}
# result用于存储最多卖出商品数量
result = 0
# 遍历货架商品,将种类和数量存储到字典中
for product in s:
# hashmap_products.get(product, 0),该函数的作用是,
# 如果字典中有键为product的值,那么直接返回键对应的值
# 如果字典中没有product的键,那么就设置初始值为0
hashmap_products[product] = hashmap_products.get(product, 0) + 1
# 遍历顾客想要购买的商品种类
for product in c:
# 如果货物架上有顾客需要的商品,那么将购买商品数量加1,而货物架商品减1
if hashmap_products.get(product, 0) != 0:
result += 1
hashmap_products[product] -= 1
# 返回最终结果
return result
复杂度
- 时间复杂度:
O(len(s)+len(c)) - 空间复杂度:
O(len(s))
相似题目
- 243. 有效的字母异位词 - 力扣(LeetCode)
- 题目描述:给定两个字符串
s和t,编写一个函数来判断t是否是s的字母异位词,也就是说s和t应该长度相同,里面的字母种类以及数量也相同。 - 示例 1:
- 输入: s = "anagram", t = "nagaram"
- 输出: true
- 示例 2:
- 输入: s = "rat", t = "car"
- 输出: false
- 相同的方法,注意边界值,如果
s和t的长度不相同,那么直接返回false。用字典存储s里面的字母类型以及数量,遍历t中的字母,如果在字典中能查到该字母,那么将字典中键对应的值减1,如果字典中任何键的值小于0,那么说明t中有s不存在的字母或t中该字母的总数量大于s中该字母的总数量,都返回false。遍历t所有的字母也没有返回false,那么说明s和t中字母种类和数量相同,返回true。 - 可以试试这道题。