问题描述
在一个超市里,有一个包含 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
思路
看到题目可以很快想到,我们应该尽量将靠前的顾客的商品排到后边,这样就可以贪心的保证每个顾客可以搜索完。所以按照这个思路,我们就能想到,按照顾客顺序的倒序排列商品即可。所以只要顾客需要的出现在商品中,我们就计数累加,最后输出答案即可。
代码
#include <iostream>
#include <vector>
#include <string>
#include <bits/stdc++.h>
using namespace std;
int solution(int n, int m, string s, string c) {
// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
// write code here
map<char, int> mp;
for (auto i : s) mp[i] ++;
int res = 0;
for (auto i : c) res += mp[i] -- > 0 ? 1 : 0;
return res;
}
int main() {
cout << (solution(3, 4, "abc", "abcd") == 3) << endl;
cout << (solution(4, 2, "abbc", "bb") == 2) << endl;
cout << (solution(5, 4, "bcdea", "abcd") == 4) << endl;
return 0;
}