问题分析
在这个问题中,我们需要尽可能多地满足顾客的购买需求,这需要综合考虑商品的初始位置和顾客的需求顺序。以下是对问题的逐步分析:
输入数据解读
-
货物架上的商品排列:
- 给定的字符串 s 表示货物架上的商品顺序。
- 每个格子可能包含一种商品(用小写字母 a-z 表示)或者是空格子(用
.表示)。
-
顾客需求:
- 给定的字符串 c 表示顾客希望购买的商品种类。
- 每种商品的需求数量可能不止一个(即字符串 c 可能包含重复字母)。
-
调整机会:
- 在顾客到来之前,可以重新排列货物架上的商品,但商品总数和种类不能改变。
- 空格子位置可以任意调整。
解决方案详细步骤
步骤 1:统计顾客需求和货物架库存
-
统计顾客需求:
- 对于顾客希望购买的商品种类
c,统计每种商品的需求数量。
- 对于顾客希望购买的商品种类
-
统计货架上的商品库存:
- 对于货物架上的商品顺序
s,统计每种商品的库存数量。
- 对于货物架上的商品顺序
-
核心数据结构:
-
用两个哈希表分别保存需求数量和库存:
demand[item]:记录顾客对商品item的需求数量。stock[item]:记录货架上商品item的库存数量。
-
步骤 2:最大化售出商品数量
-
核心匹配规则:
-
对于顾客需求的每种商品
item:- 如果该商品在货架上有库存(即
stock[item] > 0),我们尽可能满足顾客的需求。 - 如果库存充足,则售出数量为需求数量(
demand[item])。 - 如果库存不足,则售出数量为库存数量(
stock[item])。
- 如果该商品在货架上有库存(即
-
-
售出数量计算公式:
- 对于每种商品: 售出数量=min(需求数量,库存数量)
-
累加总售出数量:
- 将所有匹配商品的售出数量相加,得到总售出商品数量。
步骤 3:货物架顺序优化
-
重新调整货物顺序:
- 将顾客想要的商品尽量靠前排列。
- 顾客不需要的商品尽量靠后或填入空格位置。
-
调整逻辑:
-
根据顾客需求优先级排序货物:
- 第一优先级:按需求出现的顺序排列。
- 第二优先级:将顾客不需要的商品排到最后。
-
Python 实现
def solution(n: int, m: int, s: str, c: str) -> int:
stock = {}
for item in s:
if item != '.': # 忽略空格子
stock[item] = stock.get(item, 0) + 1
# Step 2: 统计顾客需求
demand = {}
for item in c:
demand[item] = demand.get(item, 0) + 1
# Step 3: 计算最多能售出的商品数量
sold = 0
for item, req in demand.items():
if item in stock:
sold += min(stock[item], req) # 计算实际售出数量
return sold
复杂度分析
-
时间复杂度:
- 统计库存和需求:O(n+m)
- 售出商品计算:O(m)
- 总复杂度:O(n+m)
-
空间复杂度:
- 使用了两个哈希表保存库存和需求,空间复杂度为 O(n+m)。