豆包刷题:超市里的货物架调整

103 阅读4分钟

问题描述

在一个超市里,有一个包含 m 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 m 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。

作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:

  • 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

问题分析

输入说明

  • n:货物架的格子数(商品数)。
  • m:顾客想要购买的商品种类数(不同的商品类型)。
  • s:一个长度为 n 的字符串,表示商品的初始顺序。
  • c:一个长度为 m 的字符串,表示顾客希望购买的商品种类(每个顾客会寻找一个商品)。

问题要求:通过调整商品的顺序(但不能改变顺序后顾客到来时的商品排列),使得尽可能多的顾客能够在他们的查找过程中找到他们想要的商品。

思路分析

  1. 顾客购买规则:顾客按照他们的需求(c 中的顺序)在商品架 s 中查找商品。如果找到,则顾客购买该商品并离开。如果遇到空格(或者已经有商品被购买),或者遍历完商品架后没有找到,顾客会放弃。

  2. 优化目标:我们需要通过调整商品的顺序,尽可能让每个顾客都能找到他们需要的商品,并且避免重复出售同一商品。

  3. 核心思想:为了尽可能多地卖出商品,最优策略是让每个顾客依次找到他们的商品,并尽量避免顾客在中途遇到空格。换句话说,我们需要在最优的排列下,确保顾客能顺利找到他们的商品。

  4. 动态规划的启示

我们可以将问题视为一个字符串匹配的问题,通过 最长公共子序列(LCS)  或 双指针法 来处理顾客的购买过程。 具体来说,我们可以将顾客的需求(c)与商品的排列(s)进行匹配,找到最多能够满足顾客的购买请求的商品数。

解决步骤

  1. 初始化

    将 s 和 c 转化为相应的字符序列,表示商品架上的商品以及顾客的需求。

  2. 模拟顾客购买过程

    对于每个顾客需求,我们使用双指针法或者贪心策略,在商品架 s 上找出一个可用的商品。

  3. 维护一个已售商品的记录

    使用一个标记数组,记录每个商品是否已经被售出。

  4. 最优策略

    每次顾客到来时,尽量让顾客找到他们想要的商品。如果某个商品已被售出,顾客会跳过,继续寻找下一个商品。

  5. 返回结果:最终返回能够卖出的商品数。

代码实现

def solution(n: int, m: int, s: str, c: str) -> int:
>     from collections import Counter
>     
>     # 统计顾客需求中每个商品的出现次数
>     demand_count = Counter(c)
>     
>     # 将货架上的商品按需求次数从高到低排序
>     sorted_items = sorted(s, key=lambda x: demand_count[x], reverse=True)
>     
>     # 计算最多可以卖出多少件商品
>     max_sales = 0
>     seen = set()
>     for item in sorted_items:
>         if item in demand_count and demand_count[item] > 0:
>             max_sales += 1
>             demand_count[item] -= 1
>             seen.add(item)
>     
>     return max_sales
> 
> if __name__ == '__main__':
>     print(solution(3, 4, "abc", "abcd") == 3)
>     print(solution(4, 2, "abbc", "bb") == 2)
>     print(solution(5, 4, "bcdea", "abcd") == 4)`