问题描述
在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
测试样例
样例1:
输入:
n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3
样例2:
输入:
n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2
样例3:
输入:
n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4
问题理解
我们需要在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。每个顾客只会购买他们想要的商品中第一个遇到的商品。我们需要计算在最优调整下,最多可以卖出多少件商品。
思路
- 使用一个合适的数据结构(比如字典)来统计每个商品出现的次数。
- 顾客的需求可以用一个集合来表示,这样可以快速检查某个商品是否是顾客想要的。
- 每一位顾客买走商品后相应商品出现的计数减1,当商品计数为0时,将该商品从字典中移除,不断更新。
关键点
- 频率字典:用于统计每个商品的出现次数。
def solution(n: int, m: int, s: str, c: str) -> int:
frequency = {}
for item in s:
if item in frequency:
frequency[item] += 1
else:
frequency[item] = 1
- 顾客需求处理:遍历顾客想要的商品种类,检查并更新频率字典和最大销售量。
max_sales = 0
for customer_item in c:
if customer_item in frequency:
max_sales += 1
frequency[customer_item]-=1
- 移除商品:当某个商品的计数减少到 0 时,从字典中移除该商品,以避免重复计算。
if frequency[customer_item]==0:
del frequency[customer_item]
- 返回最大销售量:
return max_sales
示例
假设 s = "abc" 和 c = "abcd",代码的执行过程如下:
- 初始化
frequency为{'a': 1, 'b': 1, 'c': 1}。 - 遍历
c:- 对于
'a',max_sales增加到 1,frequency变为{'a': 0, 'b': 1, 'c': 1},删除'a'。 - 对于
'b',max_sales增加到 2,frequency变为{'b': 0, 'c': 1},删除'b'。 - 对于
'c',max_sales增加到 3,frequency变为{'c': 0},删除'c'。 - 对于
'd',不在frequency中,不做处理。
- 对于
- 最终
max_sales为 3。