题目解析
我们有一个长度为 n 的商品列表 s,其中每个商品用一个小写字母表示。顾客会依次来购买他们想要的商品,商品列表中的商品顺序是不变的,但是我们可以在顾客到来之前重新安排商品位置,使得尽可能多的商品能被售出。
在顾客来购买商品时,顾客会从商品列表的开头开始检查,直到找到他们想要的商品。如果他们找到,就会把商品取走;如果没有找到,或者途中遇到空格(未调整的商品位置),他们就会离开。
思路
- 最优调整策略:为了让顾客尽可能多买到商品,我们需要尽可能在商品架的前面安置顾客想要的商品。具体来说,我们可以将顾客想要的商品按他们到来的顺序放到商品架的前面。这样,商品更容易被顾客找到。
- 顾客购买流程:每个顾客按照他们希望购买的商品顺序去商品架上查找,如果找到了就购买并继续,直到商品找完或者遇到一个空格。
解题步骤
- 统计货架上的商品数量:首先统计商品架上每种商品的数量。这有助于了解我们可以售出多少件商品。
- 模拟顾客购买商品的过程:对于每个顾客所需要的商品,我们检查商品架上是否有剩余库存。如果有,就卖出该商品,并减少相应的库存。
- 返回卖出的商品数量。
代码实现
pythonCopy Code
def solution(n: int, m: int, s: str, c: str) -> int:
# 统计货架上的商品数量
stock = {}
for item in s:
if item in stock:
stock[item] += 1
else:
stock[item] = 1
sold_count = 0
for item in c:
# 若货架上有商品且数量大于0,则可以售出
if item in stock and stock[item] > 0:
sold_count += 1
stock[item] -= 1 # 售出一件商品,数量减1
return sold_count
代码解析
-
统计库存 (
stock) :- 使用一个字典来记录商品架上每种商品的数量,遍历商品架字符串
s,统计每种商品的出现次数。
- 使用一个字典来记录商品架上每种商品的数量,遍历商品架字符串
-
顾客购买商品 (
c) :- 对于每个顾客希望购买的商品
item,检查该商品在库存中的数量。 - 如果库存中有该商品且数量大于 0,顾客可以购买该商品,并将该商品的库存数量减 1,售出商品数加 1。
- 对于每个顾客希望购买的商品
-
返回结果:
- 最后返回售出的商品数量
sold_count。
- 最后返回售出的商品数量
示例解析
示例1
输入:
Copy Code
n = 3, m = 4, s = "abc", c = "abcd"
- 初始商品架:
"abc" - 顾客的需求:
"abcd"
过程:
- 第一个顾客想要商品 'a',在商品架上找到 'a',售出 'a',剩余商品架
["b", "c"]。 - 第二个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架
["c"]。 - 第三个顾客想要商品 'c',在商品架上找到 'c',售出 'c',剩余商品架
[]。
结果:最多可以售出 3 件商品。
输出:
Copy Code
3
示例2
输入:
Copy Code
n = 4, m = 2, s = "abbc", c = "bb"
- 初始商品架:
"abbc" - 顾客的需求:
"bb"
过程:
- 第一个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架
["a", "b", "c"]。 - 第二个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架
["a", "c"]。
结果:最多可以售出 2 件商品。
输出:
Copy Code
2
示例3
输入:
Copy Code
n = 5, m = 4, s = "bcdea", c = "abcd"
- 初始商品架:
"bcdea" - 顾客的需求:
"abcd"
过程:
- 第一个顾客想要商品 'a',在商品架上找到 'a',售出 'a',剩余商品架
["b", "c", "d", "e"]。 - 第二个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架
["c", "d", "e"]。 - 第三个顾客想要商品 'c',在商品架上找到 'c',售出 'c',剩余商品架
["d", "e"]。 - 第四个顾客想要商品 'd',在商品架上找到 'd',售出 'd',剩余商品架
["e"]。
结果:最多可以售出 4 件商品。
输出:
Copy Code
4
学习总结
- 字典的使用:本题中我们用字典来存储商品库存数量,这样能够高效地查询和更新商品的数量。
- 贪心策略:此问题的本质是一个贪心算法问题,我们尽量让顾客找到他们想要的商品,以最大化销售数量。
- 模拟顾客购买过程:通过模拟顾客逐一购买商品的过程,帮助我们实现最优商品售出策略。
学习建议
- 数据结构的运用:在解决这类问题时,掌握如何使用字典、列表等数据结构是非常重要的,能帮助我们更高效地进行数据处理和查询。
- 贪心算法:贪心算法常用于局部最优解可以导致全局最优解的场景。在本题中,贪心地将顾客想要的商品放到前面,使得每个顾客能够尽早找到商品。
- 刷题技巧:在刷题过程中,建议记录自己的思考过程并进行总结,不仅要解题,还要理解题目背后的算法思想。