青训营 X 豆包MarsCode AI 刷题 超市里的货物架调整

66 阅读3分钟

超市里的货物架调整

问题描述

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

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


测试样例

样例1:

输入:n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3

样例2:

输入:n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:1

样例3:

输入:n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4

1. 理解问题核心

  • 目标是通过在顾客到来之前重新调整货物架上商品的顺序,使得尽可能多的顾客能找到他们想要购买的商品,从而卖出最多数量的商品。
  • 已知条件包括货物架的格子数 n,顾客想要购买的商品种类数 m,货物架上初始的商品排列情况 s(用小写字母字符串表示),以及顾客想要购买的商品序列 c(同样用小写字母字符串表示)。

2. 分析关键因素

  • 顾客购买行为:顾客会从第一个格子依次查找到第 n 个格子寻找想要购买的商品,找到就购买并离开,遇到空格子或查完所有格子未找到也会离开。
  • 调整的限制:只能在第一个顾客进入之前调整商品顺序,之后就不能再变动。

3. 考虑解题方法

  • 一种可行的思路是通过对顾客想要购买的商品序列 c 进行分析,尝试将货物架上的商品 s 调整成最有利于匹配 c 的顺序。

  • 可以采用双指针的方法来处理。一个指针遍历顾客想要购买的商品序列 c,另一个指针遍历货物架上的商品排列 s

    • 首先,初始化两个指针 i 和 j,分别指向 c 和 s 的起始位置。
    • 然后,开始遍历。当 c[i] 和 s[j] 相等时,意味着找到了一个顾客想要购买的商品,此时可以将卖出的商品数量加一,并且同时移动两个指针 i 和 j,继续寻找下一个匹配。
    • 如果 s[j] 为空或者 c[i] 和 s[j] 不相等,只移动指针 j,继续在货物架上查找是否有能匹配 c[i] 的商品。
    • 重复上述过程,直到指针 i 遍历完顾客想要购买的商品序列 c,或者指针 j 遍历完货物架上的商品排列 s

4. 计算最多可卖出商品数量

  • 在上述双指针遍历的过程中,记录下成功匹配(即找到顾客想要购买的商品)的次数,这个次数就是在最优调整下最多可以卖出的商品数量。

例如,对于样例 1:

  • 输入 n = 3m = 4s = "abc"c = "abcd"
  • 按照双指针的思路,开始时 i = 0(指向 c 中的 'a'),j = 0(指向 s 中的 'a'),因为 c[i] 和 s[j] 相等,卖出商品数量加一,同时移动 i 和 j。接着继续比较,会发现 c 中的 'b'、'c' 也能依次在 s 中找到匹配,最终卖出商品数量为 3。