超市里的货物架调整
问题描述
在一个超市里,有一个包含 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 = 3,m = 4,s = "abc",c = "abcd"。 - 按照双指针的思路,开始时
i = 0(指向c中的 'a'),j = 0(指向s中的 'a'),因为c[i]和s[j]相等,卖出商品数量加一,同时移动i和j。接着继续比较,会发现c中的 'b'、'c' 也能依次在s中找到匹配,最终卖出商品数量为 3。