超市里的货物架调整及有效的字母异位词问题 | 豆包MarsCode AI 刷题

37 阅读4分钟

问题描述

在一个超市里,有一个包含 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},卖出商品result0
  • 然后遍历顾客想要购买的商品,首先遍历第一个商品ahashmap_products总有商品a,因此卖出商品加1,货物架商品减1。此时hashmap_products{'b':1, 'c':1, 'd':1, 'e':1, 'a':0}result1
  • 然后遍历第二个商品bhashmap_products总有商品b,因此卖出商品加1,货物架商品减1。此时hashmap_products{'b':0, 'c':1, 'd':1, 'e':1, 'a':0}result2
  • 接着遍历第三个商品chashmap_products总有商品c,因此卖出商品加1,货物架商品减1。此时hashmap_products{'b':0, 'c':0, 'd':1, 'e':1, 'a':0}result3
  • 最后遍历第四个商品dhashmap_products总有商品d,因此卖出商品加1,货物架商品减1。此时hashmap_products{'b':0, 'c':0, 'd':0, 'e':1, 'a':0}result4
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
  • 相同的方法,注意边界值,如果st的长度不相同,那么直接返回false。用字典存储s里面的字母类型以及数量,遍历t中的字母,如果在字典中能查到该字母,那么将字典中键对应的值减1,如果字典中任何键的值小于0,那么说明t中有s不存在的字母或t中该字母的总数量大于s中该字母的总数量,都返回false。遍历t所有的字母也没有返回false,那么说明st中字母种类和数量相同,返回true
  • 可以试试这道题。