问题描述
在一个超市里,有一个包含 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
问题解析
这个问题看上去复杂,实际上注意问题的关键问句就可以简化。该问题最终要求得的是在最优调整下,最多可以卖出的商品数,故而无需求解“最优调整”的优化路径,而只需求解最理想状况下能售卖出的商品数,即库存所含顾客意愿购买商品量。
数据结构
由于字符串是不可变的,不利于字符的删除操作(即商品售卖后更新库存的操作),故将代表库存的字符串s转变为字符列表,以便进行更新。
算法步骤
-
初始化:
- 将库存字符串
s转换为字符列表s_lis。 - 初始化一个计数器
sold,用于记录已经卖出的商品数量。
- 将库存字符串
-
遍历字符列表:
- 从左到右遍历字符串
c,寻找顾客可以购买的商品(即该商品仍有库存)。 - 如果找到当前字符存在于库存列表
s_lis的情况,进行购买操作,在s_lis中移出该字符以更新库存,并使sold计数+1。
- 从左到右遍历字符串
-
返回结果:
- 将卖出的商品数量sold返回。
代码
def solution(n: int, m: int, s: str, c: str) -> int:
sold = 0
s_lis = list(s)
for j in c:
if j in s_lis:
sold += 1
s_lis.remove(j)
else:
continue
return sold
关键点
善用多种数据结构,利用字符串和列表各自的特点,对购物订单列表和库存列表分别进行查找和更新,以满足题解需要。