超市里的货物架调整
问题描述
在一个超市里,有一个包含 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
解析:题目乍一看很唬人,实际上是求两个字符串中最大子串的长度。思路也很简单,将两个字符串拆分为两个map,对于每个字符,统计出现的数量,最后返回两个map中同一个key的较小值就行。字节青训营的oj数据量一直较小,不知道放在别的oj里面能不能过(
代码如下
import java.util.HashMap;
import java.util.Map;
public class Main {
public static int solution(int n, int m, String s, String c) {
int count=0;
//用两个hashmap去储存它,返回同一个值中较小的值
char[] ch1 = s.toCharArray();
char[] ch2 = c.toCharArray();
HashMap<Character,Integer> map1=new HashMap<>();
HashMap<Character,Integer> map2=new HashMap<>();
for (char ch : ch1) {
map1.put(ch, map1.getOrDefault(ch, 0)+1);
}
for (char ch : ch2) {
map2.put(ch, map2.getOrDefault(ch, 0)+1);
}
for(char i='a';i<='z';i++){
if(map1.keySet().contains(i)&&map2.keySet().contains(i)){
count+=Math.min(map1.get(i), map2.get(i));
}
}
return count;
}
public static void main(String[] args) {
System.out.println(solution(3, 4, "abc", "abcd") == 3);
System.out.println(solution(4, 2, "abbc", "bb") == 2);
System.out.println(solution(5, 4, "bcdea", "abcd") == 4);
}
}