开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情
刷题的日常-2023年3月3号
一天一题,保持脑子清爽
重排字符形成目标字符串
来自leetcode的 2287 题,题意如下:
给你两个下标从 0 开始的字符串 s 和 target 。你可以从 s 取出一些字符并将其重排,得到若干新的字符串。
从 s 中取出字符并重新排列,返回可以形成 target 的 最大 副本数。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出两个字符串
- 第一个 s 是由小写英文字符组成的
- 另外一个是我们需要组成的单词
- 要求我们要从 s 中取出字符,然后将它们组成 target
- 返回我们能够组成的target的数量是多少
做题思路
要求我们组成target,然后字符是从 s 中获取的,没有顺序要求。那么就很简单了,其实只要统计 target 中出现的字符,然后看下 s 中的字符。用 target 中字母除以 s 中出现的字母,取它们的最小值即可。步骤如下。
- 开辟两个map分别记录两个字符串中出现的字符次数
- 将字符和出现的数量进行映射
- 最后循环 target,如果target中没出现的字符,直接跳过
- 如果出现过,需要取 s 中出现的次数 除以 target 中出现的次数的最小值
- 返回最终结果即可
代码实现
代码实现如下:
public class Solution {
public int rearrangeCharacters(String s, String target) {
int[] sMap = new int[26];
int[] tMap = new int[26];
int res = Integer.MAX_VALUE;
for (int i = 0; i < s.length(); i++) {
sMap[s.charAt(i) - 'a']++;
}
for (int i = 0; i < target.length(); i++) {
tMap[target.charAt(i) - 'a']++;
}
for (int i = 0; i < tMap.length; i++) {
if (tMap[i] == 0) {
continue;
}
res = Math.min(sMap[i] / tMap[i], res);
}
return res;
}
}