问题描述: 在一个超市里,有一个包含n个格子的货物架,每个格子中有一种商品,商品用小写字母a到z表示。当顾客进入超市时,他们会依次从第一个格子查找到第n个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多的出售商品。当地一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明: #n:货架的格子数 #m:顾客想要购买的商品种类数 #s:货物架上商品的初始顺序 #c:顾客想要购买的商品种类 测试样例: 样例一:输入n=3,m=4,s="abc",c="abcd" 输出:3 样例二:输入:n=4,m=2,s="abbc",c="bb" 输出:2 样例三:输入:n=5,m=4,s="bcdea",c="abcd" 输出:4
问题分析
- 理解问题:我们需要在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。每个顾客只会购买他们想要的商品中第一个出现在货架上的商品。
- 目标:最大化售出的商品数量。
- 输入:
n:货架的格子数m:顾客想要购买的商品种类数s:货架上商品的初始顺序c:顾客想要购买的商品种类
- 输出:最多可以卖出多少件商品
解题思路
-
数据结构选择:
- 使用一个集合来存储顾客想要购买的商品种类,这样可以快速判断某个商品是否是顾客想要的。
- 使用一个列表来存储货架上商品的初始顺序。
-
算法步骤:
- 遍历顾客想要购买的商品种类,尝试将这些商品尽可能靠前地放置在货架上。
- 计算最终可以卖出的商品数量。
代码提示
以下是一些代码提示,帮助你实现这个算法:
def solution(n: int, m: int, s: str, c: str) -> int:
# 将顾客想要购买的商品种类放入集合中
wanted_items = set(c)
# 初始化一个列表来存储调整后的货架顺序
adjusted_shelf = []
# 遍历货架上的商品,将顾客想要的商品优先放入调整后的货架
for item in s:
if item in wanted_items:
adjusted_shelf.append(item)
wanted_items.remove(item) # 避免重复添加
# 将剩余的商品放入调整后的货架
for item in s:
if item not in adjusted_shelf:
adjusted_shelf.append(item)
# 计算最终可以卖出的商品数量
sold_items = 0
for item in adjusted_shelf:
if item in set(c):
sold_items += 1
c = c.replace(item, '', 1) # 移除已经购买过的商品
return sold_items
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd") == 3)
print(solution(4, 2, "abbc", "bb") == 2)
print(solution(5, 4, "bcdea", "abcd") == 4)
关键步骤解释
- 将顾客想要购买的商品种类放入集合中:这样可以快速判断某个商品是否是顾客想要的。
- 遍历货架上的商品:将顾客想要的商品优先放入调整后的货架,并从集合中移除这些商品,避免重复添加。
- 计算最终可以卖出的商品数量:遍历调整后的货架,统计顾客可以购买的商品数量。