刷题的日常-重排字符形成目标字符串

102 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

image.png