题目所使用的编程语言 :c++
题目复现
问题描述
在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
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
思路分析
实际上对于本题,由于商品的种类与数量是采用对应的小写字符a-z来进行对应的表达,那么我们就可以将货架使用一个大小为26的数组来进行表示并初始化,然后按照对应的操作进行处理,从而达到题目的要求,下面是详细的思路分析:
初始化两个数组 a[26] 和 b[26],分别用于存储商品字符串 s 和顾客购买字符串 c 中每个字母出现的次数。这里假设所有字符都是小写字母,所以使用了长度为26的数组来对应26个英文字母。
遍历字符串 s,对每个字符出现的次数进行计数,并将结果存储在数组 a 中。
同样地,遍历字符串 c,对其每个字符出现的次数进行计数,并将结果存储在数组 b 中。
接下来,遍历这26个字母,比较 a[i] 和 b[i] 的值:
如果 b[i] 大于 a[i] 并且 a[i] 不为0,
则说明顾客希望购买的某个字母的数量超过了商品中该字母的实际数量,此时只能卖出 a[i] 个这样的字母。
如果 a[i] 至少与 b[i] 相等并且 b[i] 不为0,则说明可以完全满足顾客对于该字母的需求量,这时会将 b[i] 加入到 count 中,并更新 a[i] 减去 b[i]。
最后返回 count,它表示顾客最终能购买到的字符总数。
而在进行了思路的分析之后,我们就可以开始实现相关的代码
代码实现
#include <iostream>
#include <string>
using namespace std;
int solution(int n, int m, string s, string c) {
// write code here
int lena = s.length();
int lenb = c.length();
int count= 0;
int a[26];//代表字符出现的次数-商品
int b[26];//代表字符出现的次数-顾客购买
for (int i = 0;i<26;i++){
a[i]=0;
b[i]=0;
}
for (int i = 0;i<lena;i++)
{
a[s[i]-97]++;
}
for (int i = 0;i<lenb;i++)
{
b[c[i]-97]++;
}
for (int i = 0;i<26;i++){
if (b[i]>a[i] && a[i]>0){
count+=a[i];
a[i]=0;}
if (a[i]>=b[i] && b[i]!=0){
count+=b[i];
a[i]-=b[i];
}
}
return count;
}
int main() {
cout << (solution(12, 8, "abbcbccabcaa", "bbbbbbbb") == 4) << endl;
return 0;
}