问题描述
超市有一个包含 n 个格子的货物架,每个格子存放一种商品,用小写字母 a∼z 表示。顾客有一个想要购买的商品列表 c,他们依次从第一个格子开始查找,直到找到所需商品、遇到空格子、或查找结束。如果找到目标商品则购买并离开,若未找到则离开。作为管理员,你可以在顾客到来之前调整货物顺序,目标是使得卖出的商品数量最多。计算在最优调整下,最多可以卖出多少商品。
解题思路
核心问题是如何高效地匹配顾客的需求和货物的库存,最大化销售数量。在调整货物顺序后,以下几个关键点需要注意:
- 货物统计
用哈希表记录每种商品的数量,统计货物架上每种商品的数量,用字典记录 s 中每种商品的库存。例如,若货物架为 s="abbc",统计结果为 {a:1, b:2, c:1}。 - 顾客需求处理
遍历顾客需求列表 ccc,每次查看当前需求商品是否在库存中:- 若库存中有该商品且数量大于 0,则售出商品,库存减 1,售出商品计数增加。
- 若库存不足或该商品不存在,则跳过当前需求。
- 售出规则
按照需求列表 ccc 的顺序售出商品,每次售出后,库存更新,以确保后续商品匹配的准确性。例如,当需求为 c="bb" 时,匹配过程会消耗两件 b,库存从 {a:1, b:2, c:1} 变为 {a:1, b:0, c:1}。
解题步骤
- 统计货物库存:
遍历货物字符串 s,用字典存储每种商品的数量。 - 遍历顾客需求:
对顾客列表 c 中每种商品,检查是否在库存中。如果库存足够,售出商品并减少库存。 - 累加销售数量:
将匹配成功的商品数量累加,得到最大销售量。 - 匹配最优调整的效果
调整商品位置后,按需求列表从左到右依次匹配,即相当于尽可能把顾客需要的商品摆在前面以提高售出效率。
算法步骤
- 统计库存:
遍历字符串 sss,用字典记录每种商品的数量,表示货物库存。 - 匹配顾客需求:
遍历字符串 ccc,对每种顾客需求商品:- 如果商品在库存中且库存大于 0,则售出商品,计数器加 1,库存减 1。
- 否则,跳过该商品。
- 返回结果:
统计并返回售出的商品总数。
Python实现
def solution(n: int, m: int, s: str, c: str) -> int:
# 统计货物架上每种商品的数量
shelf_count = {}
for item in s:
if item in shelf_count:
shelf_count[item] += 1
else:
shelf_count[item] = 1
# 统计能卖出的商品数量
total_sold = 0
for item in c:
if item in shelf_count and shelf_count[item] > 0:
total_sold += 1
shelf_count[item] -= 1 # 购买后减少库存
return total_sold
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd") == 3)
print(solution(4, 2, "abbc", "bb") == 2)
print(solution(5, 4, "bcdea", "abcd") == 4)
复杂度分析
-
时间复杂度:
- 遍历货物字符串 s:O(n)。
- 遍历顾客需求 c:O(m)。
- 总体复杂度为 O(n+m)。
-
空间复杂度:
- 使用一个字典存储货物种类,大小为 O(1)(最多 26 个字母),总体空间复杂度为 O(1)。
测试样例
| 输入参数 | 输出 |
|---|---|
| n=3,m=4,s="abc",c="abcd"n = 3, m = 4, s = "abc", c = "abcd" | 33 |
| n=4,m=2,s="abbc",c="bb"n = 4, m = 2, s = "abbc", c = "bb" | 22 |
| n=5,m=4,s="bcdea",c="abcd"n = 5, m = 4, s = "bcdea", c = "abcd" | 44 |
思路优化
- 利用哈希表统计库存,保证快速查找和更新。
- 按需求顺序遍历,不涉及复杂的排列或排序操作,时间效率较高。
- 降低复杂度的同时,确保能够处理大规模数据(如 n,m 在百万级别)。
此解法平衡了可读性和高效性,适合直接应用于实际场景。